16331239353195370.0'ın özel bir önemi var mı?


88

Kullanarak import numpy as npbunu fark ettim

np.tan(np.pi/2)

başlıktaki numarayı verir, değil np.inf

16331239353195370.0

Bu numarayı merak ediyorum. Bazı sistem makine hassaslık parametresiyle mi ilgili? Bunu bir şeyden hesaplayabilir miydim? (Benzer bir şeyin çizgisinde düşünüyorum sys.float_info)

DÜZENLEME: Aynı sonuç Java, octace, matlab gibi diğer ortamlarda da tekrarlanabilir ... Yine de önerilen dupe nedenini açıklamıyor.



10
Bu yanıtı beğenmedim - tamamen elle dalgalı, sebebini gerçekten açıklamıyor. "Radyan cinsinden bronzluk (pi / 2) aslında sonsuzdur, değil mi?" neden hakkında hiçbir şey açıklamıyor - burada OP'nin sorduğu gibi - cevap aslında değilnp.inf . Ama öyle değil neden sadece açıklamak basit, ama aynı zamanda cevabı görüldü tam olarak ne niçin - ve ;-) yaptım çok
Tim Peters

Yanıtlar:


119

piPython float ile tam olarak gösterilemez (platform C'nin doubletipiyle aynı ). En yakın temsil edilebilir yaklaşım kullanılır.

Kutumda kullanımdaki kesin tahminler (muhtemelen kutunuzdakiyle aynı):

>>> import math
>>> (math.pi / 2).as_integer_ratio()
(884279719003555, 562949953421312)

Bu oranın tanjantını bulmak için şimdi wxMaxima'ya geçeceğim:

(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16

Yani aslında sahip olduklarınızla aynı. Kullanılacak ikili yaklaşım pi/2, matematiksel ("sonsuz kesinlik") değerinden biraz daha azdır pi/2. Yani bunun yerine çok büyük bir teğet elde edersiniz infinity. Hesaplanan tan()gerçek giriş için uygundur!

Tam olarak aynı türden nedenlerle, ör.

>>> math.sin(math.pi)
1.2246467991473532e-16

0 döndürmez. Yaklaşım math.pibiraz daha küçüktür pive görüntülenen sonuç bu gerçek göz önüne alındığında doğrudur.

Math.pi'yi GÖRMENİN DİĞER YOLLARI

Kullanımdaki kesin tahmini görmenin birkaç yolu vardır:

>>> import math
>>> math.pi.as_integer_ratio()
(884279719003555, 281474976710656)

math.pi bu oranın matematiksel ("sonsuz kesinlik") değerine tam olarak eşittir.

Veya onaltılık gösterimde tam bir kayan nokta olarak:

>>> math.pi.hex()
'0x1.921fb54442d18p+1'

Veya hemen hemen herkes tarafından en kolay anlaşılan şekilde:

>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')

Hemen açık olmasa da, her sonlu ikili kayan nokta, sonlu bir ondalık kayan nokta olarak tam olarak gösterilebilir (tersi doğru değildir ; örneğin ondalık 0.1, sonlu bir ikili kayan nokta olarak tam olarak gösterilemez)Decimal(some_float) kurucu tam eşdeğeri üretir.

Aşağıda pi, tam ondalık değerinin izlediği gerçek değer math.pive üçüncü satırdaki düzeltme işareti, farklı oldukları ilk basamağı gösterir:

true    3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
                         ^

math.pi"hemen hemen tüm" kutularda aynıdır, çünkü neredeyse tüm kutular artık aynı ikili kayan nokta biçimini kullanır (IEEE 754 çift duyarlık). Bunu üzerine onaylayın için yukarıdaki yöntemlerden herhangi birini kullanabilirsiniz senin kutu veya kutu bir istisna ise kullanımda hassas yaklaşımının bulunması için.


@Tim Peters - Bu çok açık. Tamlık için bu temsilinin np.pisistemin epsilonuna en yakın rasyonel temsil olduğunu tahmin ediyorum.
Aguy

3
np.piPython'unkiyle aynı değere sahip olduğunu varsayarsak math.pi(kontrol etmedim, ancak yapabilirsiniz ;-)), platformun doğal C doublekayan nokta biçiminde gösterilebilen matematiksel pi'ye en yakın değerdir . Bu, şu anda neredeyse tüm kutularda IEEE 754 çift hassasiyet anlamına gelir ve bu nedenle 53 bitlik (mantis) hassasiyetle en yakın ikili kayar. Dolayısıyla, rasyonel seti, +/- I * 2**Jtamsayının I0 veya 2**52 <= I < 2**53tamsayının aralığı, Jyakın herhangi bir yerde bu formun tüm rasyonellerini kapsayacak kadar geniş olduğu formla sınırlandırılmıştır pi.
Tim Peters

2
Ben istiyorum Ve bu yüzden seviyorum "ikili" trigonometrik fonksiyonlar daha yaygın uygulanması halinde. Pi asla bir rasyonel olarak temsil edilemeyeceğinden, 0'dan 1'e kadar açılarda çalışan bir dizi işlev için kullanışlı olacaktır.
boru

Şey, ithal ettiler np.pi, değil math.pi.
EKons

2
@ Έρικ Κωνσταντόπουλος math.pi, np.pive scipy.pihepsi aynı; sadece adlandırma kolaylığı için kopyalanırlar; stackoverflow.com/questions/12645547/…
Tim Peters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.