SORU
5 Kasım 2012, PAZARTESİ


Nasıl ifade taşma önlemek için. * B - C * D

Gibi görünen bir ifade hesaplamak gerekiyor: Çeşitleri nerede A*B - C*D,: signed long long int A, B, C, D; Her sayının çok büyük olması (kendi türü taşan değil). A*B taşmasına neden olabilir iken, aynı zamanda ifade A*B - C*D çok küçük olabilir. Nasıl doğru bir şekilde hesaplayabilir miyim?

Örneğin: MAX = LLONG_MAX - n MAX * MAX - (MAX - 1) * (MAX 1) == 1 ve n - doğal bir sayı.

CEVAP
5 Kasım 2012, PAZARTESİ


Bu sanırım çok önemsiz görünüyor. Ama A*B taşma.

Aşağıdaki, hassas kaybetmeden yapabilirsin

A*B - C*D = A(D E) - (A F)D
          = AD   AE - AD - DF
          = AE - DF
             ^smaller quantities E & F

E = B - D (hence, far smaller than B)
F = C - A (hence, far smaller than C)

Bu ayrışma olabilirdaha da bitti.
@Gian işaret ettiği gibi, dikkat ederseniz bu tip imzasız uzun uzun çıkarma işlemi sırasında alınması gerekebilir.


Bu söz konusu durum ile, örneğin, sadece bir yineleme alır

 MAX * MAX - (MAX - 1) * (MAX   1)
  A     B       C           D

E = B - D = -1
F = C - A = -1

AE - DF = {MAX * -1} - {(MAX   1) * -1} = -MAX   MAX   1 = 1

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • aki6336

    aki6336

    14 AĞUSTOS 2008
  • tsweeney79

    tsweeney79

    21 Ocak 2008
  • xCraash

    xCraash

    6 Temmuz 2012