2015-01-29 29 views
5

2 fonksiyonunuz var;Kayan Nokta; Division vs Multiplication

f(x)= x(((x+1)^(1/2))-(x^(1/2)))  
g(x)= x/(((x+1)^(1/2))+(x^(1/2))) 

Hangisi daha doğru?

Yan not: Nedenini açıklayabilseydiniz, bu gerçekten bana yardımcı olabilirdi, bir hisâtçı olmadığı için f (x) olduğunu hissediyorum ama% 100 emin değilim.

+1

SO için Waaaay konu dışı, yerine [math.stackexchange] (http://math.stackexchange.com/) deneyin. –

+0

Hello Claire, StackExchange farklı konulara odaklanarak birden fazla sayfaya bölünmüştür. Bunlardan biri [Matematik] (http://math.stackexchange.com/). Sorunuzu orada sormalısınız. – Stefan

+0

Teşekkürler, ben sadece –

cevap

5

Kayan nokta aritmetiği, gerçek matematikten oldukça farklıdır. Özellikle, kayan nokta aritmetiği ilişkilendirici veya dağıtıcı değildir. Bu nedenle, matematiksel olarak eşdeğer ifadeler, sınırlı sonlu kayan noktalı aritmetik ile değerlendirildiğinde mutlaka eşdeğer değildir. Bu, toplama, çıkarma, çarpma, bölme ve karekök gibi bireysel işlemlerin, IEEE-754 floating-point standard'un gerektirdiği gibi doğru sonuçlar elde ettiğinde bile bu durum geçerlidir.

Bu durumda g(), f()'dan ve aynı zamanda x = 500 özel durumu için çok daha doğru olacaktır. Bunun nedeni, f()'un eksiltici iptalden kaynaklanmasıdır. Bu, hemen hemen aynı büyüklükteki iki kayan noktalı sayının etkili çıkarılması sırasında ortaya çıkar. Öncelikli basamaklar, çıkarma sırasında iptal eder ve sonraki hesaplamaya giren geriye kalan birkaç rakamı bırakır. Ayrıca, çıkarılmak istenen orijinal işlenenlerin sondaki rakamlarında biriken herhangi bir yuvarlama hatası müteakip hesaplama ile büyütülebilir. Örnekle genişletilmiş bir açıklama this Wikipedia article'da bulunabilir. Bu durumda, sqrt(x+1) ve sqrt(x)sqrt(x+1) ve sqrt(x), özellikle x'un büyüklüğü arttıkça hemen hemen aynı büyüklüktedir. x = 500 örneği kullanılarak ve IEEE-754 tek hassas aritmetik kullanılarak, sürekli olarak: g(500) doğru tek duyarlıklı sonucu yuvarlak verirken f(500) içinde

x = 500 f(x) = 0x1.659ae0p+3 (11.175156) reference = 0x1.659798p+3 (11.174755) 
x = 500 g(x) = 0x1.659798p+3 (11.174755) reference = 0x1.659798p+3 (11.174755) 

hata, 420 ulps olup.

+0

Merak etme, 'f' daha doğru olan değerler var mı? Sadece "ortalama" değil mi? – Teepeemm

+0

OT: Cevabımın otomatik olarak bir topluluk vikisine dönüştüğü garip. @Teepeemm: Evet, rastgele IEEE-754 tek hassasiyetli argümanlar ile yapılan bir elli çekle, böyle sayısız vaka var. Örneğin: 'x = 0x1.6fa276p-2 (3.59018177e-1); f (x) = 0x1.a09844p-3 (2.03415424e-1); g (x) = 0x1.a09846p-3 (2.03415439e-1); ref = 0x1.a09844p-3 (2.03415425e-1); ulperr (f) = 6.71231e-2; ulperr (g) = 9.32877e-1 ' – njuffa

İlgili konular