SORU
30 Ocak 2014, PERŞEMBE


() pow biri tarafından burada gibi görünüyor

Neler oluyor burada:

#include <stdio.h>
#include <math.h>
int main(void) {
    printf("17^12 = %lf\n", pow(17, 12));
    printf("17^13 = %lf\n", pow(17, 13));
    printf("17^14 = %lf\n", pow(17, 14));
}

Bu çıktıyı alıyorum:

17^12 = 582622237229761.000000
17^13 = 9904578032905936.000000
17^14 = 168377826559400928.000000

13 ve 14 wolfram alpa cf ile eşleşmiyor:

12: 582622237229761.000000
    582622237229761

13: 9904578032905936.000000
    9904578032905937

14: 168377826559400928.000000
    168377826559400929

Ayrıca, bazı garip kısmı tarafından yanlış değil. - tam bir yanlış!

Eğer bu iş bana düştü pow() benim için ne yapabilir sınırına ulaşır ise, bu hesaplanabilir bir alternatif var mı? x^y Her zaman daha az ULLONG_MAX bulunduğu x^y, hesaplayan bir fonksiyon ihtiyacım var.

CEVAP
30 Ocak 2014, PERŞEMBE


pow double sayılar ile çalışır. Bu 53 bit bir tamsayı burada s * 2^e-s formunu sayıları temsil eder. Bu nedenle double 2^53, ama sadece altındaki tüm tamsayıları saklayabilirbazı2^53 yukarıda tamsayılar. Özellikle, tek çift sayılar ^ temsil edebilir . Beri e^2 ^ 53,. 0 değeri her zaman 2 katı.

17^13 e 1 olarak ayarlanır ve bu nedenle hesaplanan değer sayı olur öyle olsa bile tam olarak temsil etmek için 54 bit gerekir. Doğru değeri tek, kapalı bir o kadar da şaşırtıcı değil. Aynı şekilde, 17^14 temsil eden 58 bit alır. Ben de bir tarafından kapalı olan şanslı bir tesadüf (çok fazla sayıda teori geçerli olmadığı sürece), sadece tek bir kapalı oluyor32 birden fazlabu büyüklükte double Sayı yuvarlanır parçalı yapı.

Tam tamsayı üs için, tamsayılar her şekilde kullanmalısınız. double-ücretsiz kendi üs rutin yaz. Eğer y büyük olabilir Eğer oyun tarafından üs kullanın, ama her zaman bu sorunu tartışmalı hale 64, daha az sanırım.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • KIT KAT

    KIT KAT

    3 EKİM 2005
  • Tom Megalis

    Tom Megalis

    18 NİSAN 2006
  • VJ VIMANA

    VJ VIMANA

    3 Mayıs 2007