Kayan nokta hassasiyetini müşterilere açıklama [kapalı]


23

Kayan nokta yuvarlama sorununu müşterilere açıklamanın en iyi yolu nedir ?

biliyorum

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

C ++ SSS’deki girişler ve geliştiricilere ve bilim insanlarına yönelik çeşitli sayfalar, fakat sınırlı bir matematiksel veya bilimsel geçmişe sahip "normal" müşterilere yönelik bir web sayfası, makale veya açıklama var mı? (yukarıdaki referanslar düz olduğu için).

Tanınmış ve tanınmış bir kurum veya kuruluştan sağlandıysa ya da geldiyse, bazılarınızın daha iyi olacağı göz önüne alındığında, bazılarınızın deneyimlediği gibi, kendinizi açıklamak biraz karışık olabilir.


1
Rahatsız etmem ...
John Shaft

1
Bu gerçekten harika bir soru, eğer yapabilseydim +10. Geliştiriciler için sık rastlanan bir sorun.
Cody Gray

2
Bu bir detay sorunu değil, neden 2 ondalık basamaklı sayıya bakacak şekilde ekleme ekliyor, neden bir 5.9999999 ile sonuçlanıyorsunuz ve 6 ile değil ve sonuç "açık" olduğunda neden yuvarlama hassasiyetini belirtmeniz gerekiyor? ikiden fazla ondalık basamağa sahip değil. Ya da neden bazen 2 eksi 2 her zaman sıfır değildir ve bunu yaparken bamboozling aptalı gibi görünmez.
Eric Grange

9
@Eric Grange: Müşterileriniz bu hassas sorunları bir hata olarak görüyorsa , o zaman bir hatadır ve çözmenin bir yolunu bulmanız gerekir (belki de şamandıra kullanarak değil). Bu hassas sorunun nereden geldiği umrumda değil. Yazılımınızın nasıl çalıştığını umursamıyorlar. Sadece çalışmasını istiyorlar.
David

3
@Eric: Kayan nokta kullanımı bir uygulama detayıdır. Soruda açıkladığım ve soruda açıklanamayan bir şeyi söyleyemeyen ve açıkça netleştiremediğim soruyu tekrar ediyorum (özür dilerim): bağlam nedir ve neden bir müşteriyle kayan nokta kullanımını tartışıyorsunuz?
Tom Anderson

Yanıtlar:


8

Bunun için açıklamak için basit bir yol bulmak göstermek onu. xBir sayıya bölünmenin ardından aynı sayı ile çarpmanın sizi xtekrar geri getirmesi gerektiğini tartışın ; müşterinin bunun her zaman böyle olması gerektiği konusunda hemfikir olmasını sağlayın. Sonra eski (100 / 3) * 3hesap makinesinde yapın; değerin beklediğiniz gibi 100'e dönmediğini gösterin. Çoğu kişi, basit bir şekilde matematiğin “parçalandığını” görünce, o zaman doğruluğun önemli olduğu yerlerde kayar nokta sayılarının tehlikesini “alma” eğilimindedir. Bu, düşük seviyeden ziyade, işaret ettiğiniz makaleye gitmek yerine).

Maalesef, yarı yarıya yakın hesap makinelerinin çoğu (bugün gördüğüm bütün bilimsel olanları ve birkaç temelden fazlasını içeren) bugün başa çıkabiliyor - sanırım gösterilebilecek ve yuvarlanabileceklerin ötesinde fazladan rakam saklıyorlar. Müşterinizin önünde yapmadan önce hesap makinenizin ne kadar zeki olduğunu kontrol edin.


1
Evet, hemen hemen tüm hesap makineleri en az 2 ekstra basamak depolar, bu nedenle karışıma birkaç çarpma eklemeniz gerekir; bu da açıklamayı karıştırır ve IME onları kandırmaya çalıştığınızı düşünmelerini sağlar. Karekök daha az işlem gerektirir, ancak karekök zaten normal müşterilerin günlük aleminin dışındadır.
Eric Grange

2
@Scott burada birkaç hesap makinesinde denedim, hiçbiri (100/3) * 3, hatta (100/3) * 3-100 ile hiç sorun çıkmadı.
Eric Grange

9
Örnek olarak parayı alın, mükemmel bir sınırlı hassasiyete sahip. Bir dolara ayrıldığınızı açıklayın, sonra herkes 33 sent alır ve bir kuruş yuvarlanırken kaybedilir. Herkes bununla ilgili olabilir.
Inca

4
Hesap makinesi ile uğraşma. Üç önemli basamağı tutarak kağıda 1 ile 3'e bölün.
David Thornley

5
@omegacentauri, bu açıklamanın yardımcı olacağını düşünüyorsanız, müşterilerle sık sık görüşmediğinizi tahmin ediyorum.
jhocking

5

Kısayollar olduğunu sanmıyorum. Şunlardan birini yapmalısın:

  • Kayan noktanın ne olduğunu ve nasıl davrandığını anlayın.

Veya, eğer bu çok gerekliyse, yapmanız gerekenler:

  • Bilgisayarın size kesin sayısal sonuçlar vermeyeceğini kabul edin.

Belki irrasyonel sayılar ile bir örnek (kayan nokta sorunları sıra rasyonel sayılar için geçerli olsa bile) yardımcı olur: sqrt(2) ~ 1.414. Öyleyse 1.414^2 = 1.999396. Kaç tane rakam alırsanız alın orijinale asla geri dönemezsiniz 2. Tamam, doğru 4 önemli basamak kabul edilebilir, ancak daha sonra bu tür "yuvarlama hataları" birikirse ne olacağını düşünün. Asıl tehlikenin olduğu yer orası.


2
Ben şahsen tanıyorum ve anlıyorum, ancak bazı insanlar için "kayan nokta" zaten yabancı bir terimdir, bu yüzden kafasında hesaplayabileceklerini, pahalı bilgisayarlarını ve yazılımlarını düzeltmekte zorlandıklarını açıklamak için matematiksel veya bilimsel bir açıklamadan daha fazlasına ihtiyacınız vardır. ;) Ayrıca karekök düzenli müşterilerin günlük aleminin dışındadır.
Eric Grange

5

İlk önce, ne hakkında şikayet ettiklerini belirleyin. Finansal işlemler tam olarak doğru sayıda ondalık basamağa ve doğru yuvarlama kurallarına göre yapılmalıdır. Bu, tipik olarak, birleşik para birimlerinin sayısının korunması ve aritmetik işlemlerin doğru yapıldığından emin olmak anlamına gelir.

Alternatif olarak, aşırı ekran gösterimlerinden şikayetçi olabilirler ve önemli basamak çıkış sayısının azaltılması gerekli olan tek şey olabilir.

Genel olarak sayılar için, x * 3 10 olacak şekilde her zaman üç basamaklı bir ondalık x ile çıkmaya çalışabilirsiniz. Bu temel ilkeleri gösterir.

Kalan iki sorun var. Birincisi, belirli sayıların tam olarak ondalık biçimde ifade edilebildiği, ancak ikili olamayacağıdır (3.15, diyelim). Bu teknik olmayan insanlara açıklamak zor olacak ve en iyi iddia, ortaya çıkması için yeterli rakamları sağlayarak kaçınmaya çalışmaktır. Diğeri, bilgisayar aritmetiğinin her zaman kesin olmadığını ve ondalık aritmetiğinin her zaman kesin olmadığını anlamaya yetmeyeceğini biraz bilen müşteridir. Bunlardan birkaçı ile tartışmıştım ve bildirecek yararlı hiçbir şeyim yok.


3

Bilgisayarlarda kayan nokta sayıları ikili kullanır, bu nedenle tıpkı sayıları olan bir sayı sistemimizde olduğu gibi, onlarca, yüzlerce ve onuncu, yüzlerce sütun, bilgisayarlarda kayan nokta sayıları gerçekte bir, iki, dört ve yarım, çeyrek ve sekizinci sütunlar. Müşteri ayak / inç bilgisine sahipse, ölçüm için genellikle inç inç baz-2 fraksiyonlarını nasıl kullandığınızı hatırlatın.

Şimdi 10 senti yarım, çeyrek ve bir doların sekizinci bir kombinasyonu olarak depolamaya çalışın. Sadece çalışmıyor:

.00011001100110011. . . ( sonsuz tekrarlar )

Standart bir emperyal ölçüm bandı almak ve onda bir inç ölçmeye çalışmakla aynı şey. Doğru yapamazsın. 1 / 10'u X / Y olarak göstermez, burada X ve Y tam sayılardır ve Y 2'nin gücüdür.

Bu nedenle, her bir ondalık basamağı depolamak için 4 bit kullanan ondalık veri türlerine sahibiz, bu yüzden temel 10 gösterime geri döndük. Değişim uzayda ve performansta (okuduklarımdan% 100 civarında bir performans düşmesi).


1

Onlara, banka hesaplarında olduğu gibi 4.4423425908459032890413 ... $ (4.44 $ veya 4.45 $, bunların arasında bir şey yok) tutamayacağını söyleyin, bilgisayar kolayca bir sayıyı rasgele bir şekilde saklayamaz. Depolamanın kusurları hesaplamaların hatalı olmasına neden olur.

(Biraz hile yapıyor, ancak onlara sorunun ne olduğu hakkında bir fikir vermeli.)


2
Ne yazık ki, bu açıklama işe yaramıyor, çünkü başlangıçta yalnızca iki hassasiyet rakamı olan sayıları toplarken, kesin sorun olabilir.
Eric Grange

1
İki ondalık basamak. Evet, katılıyorum, meraklı bir müşteri içinde delikler görecek. Ama onlardan ikili gösterimin tartışmasıyla onlara vurabilirsiniz - onlar bunu istedi ;-)
quant_dev

Zaten, kayan noktayı açıklamaya çalışıyorlarsa IME, onları basitçe, anlaşılır terimlerle veya iyi bilinen bir kurumdan veya kurumdan gelirse hafifletilebilecek bir şey olan, onları boboze etmeye çalıştığınızı düşünmeye hemen başlar. :)
Eric Grange

1
@Eric Math zor, haydi beyzbol oynayalım: P
quant_dev 17:11

1
Bir şeyi en yakın 1/10 "veya en yakın milimetreye ölçmenin daha kesin olup olmadığını sorun. İkincisi daha kesindir, ancak 0.1" değerinin kesin bir katı olan nesneler, aynı zamanda olmadıkça 1 mm'lik kesin bir katı olmaz 5 "(tam olarak 127mm) 'nin tam katı. En yakın 0.1"' e ölçülen iki 2.54mm objenin boyutunun eklenmesi, 0.2 "birleşik bir boyut verecektir; gerçek boyut 5.08mm olmalıdır
supercat

1

2/3

Kesin cevabını ikiye bölerek 3'e bölün. 3
'Sonsuza dek sürecek' cevabını belirtebilirsiniz.

1/3 kullanmak da işe yarayacaktır, ancak 2/3 belki de daha iyi bir örnektir. Örneğin, yuvarlama (ör.) .6666667 .3333333 sadece kesilmiş gibi görünüyor.


0

Hesaplamalar yaparken, bilgisayarlar genellikle sayılara yaklaşımı kullanırlar (1000000.7 kullanmak yerine 1000000 kullanırlar) çünkü yaklaşıkları kullanmak çok daha hızlıdır. Bununla ilgili sorun, yaklaşık hesaplamaları yaptığınızda, yaklaşık hesaplamaları geri almanızdır. Genellikle bu oldukça iyi çalışır, ancak bazen beklenmeyen sonuçlara yol açar.


Burada ne dediğini anlamıyorum. "Çünkü yaklaşımları kullanmak çok daha hızlı" mı? Bazen tamsayı aritmetiği en az olduğu kadar hızlıdır ve bu kesindir. Bazen hiçbir alternatif yoktur (2'nin karekökünü basarken olduğu gibi).
David Thornley

Peki, pazarlamacılara neden bilgisayarların neden irrasyonel sayıları temsil edemediğini veya temelde bir şeylerin genel şemasında herhangi bir sayıyı temsil edemediğini açıklamaya çalışın (oh ve o zaman ona \ pi mantıksızlığı hakkında hızlı bir ders vermek isteyebilirsiniz: Fourier serisi sevimli olabilir). Yaklaşık, insanların anlayabileceği bir kelimedir. Buna, tüm sayıların eşit olmadığını bilen birinin bakış açısından yaklaşıyorsunuz.

0

Bazı hesaplamalar bazı yasal kurallara göre yapılır. Örneğin, Almanya'da 79.245,18 Avro'luk vergilendirilebilir yıllık gelir için ne kadar gelir vergisi ödenmesi gerektiğini hesaplamak istiyorsanız, yalnızca bir doğru cevap vardır. Doğru anlarsın ya da yanlış anlarsın. Doğru yaparsanız, kayan nokta aritmetiğinin nasıl çalıştığını açıklamanıza gerek yoktur. Yanlış yaparsanız, kayan nokta aritmetiğinin nasıl çalıştığını açıklamanıza gerek yoktur, kırılan kodunuzu düzeltmeniz gerekir.

Bazen düzgün görünmeyen sonuçları görüntülersiniz. Örneğin, iki basamaklı hane ile 13,297,46 ABD Doları'nı İngiliz Sterlini'ne dönüştürürseniz ve ardından bu İngiliz Sterlini miktarını ABD Doları'na dönüştürürseniz, 13,297,46 ABD Doları değil, 13,297,45 ABD Doları veya 13,297,47 ABD Doları'nı alamazsınız. Bunun kayan nokta aritmetiği ile ilgisi yok. Bu kaçınılmaz bir sorun ve neden kaçınılmaz olduğunu açıklayabiliyorsanız. (Ayrıca, İngiliz Sterlini'nden ABD Doları'na geri döndüğünüzde sorunun neden olmadığını da bilmelisiniz).

Doğru görünmeyen başka olası sonuçlar var. Rakamları yüzdelere dönüştürürseniz, yüzdelerin% 100'e kadar eklemesi gerekir, ancak olmayabilir. İki ondalık basamak içeren dört yüzde görüntülerseniz, görüntülenen dört yüzde% 99,99 veya% 100,01 oranına kadar ekleyebilir. Kayan nokta aritmetiği ile ilgisi yok. Yine de nedenini açıklayabilmelisin.

Daha sonra, kayan nokta aritmetiğinin dikkatsiz kullanımının uygunsuz sonuçlara yol açtığı durumlar vardır. Örneğin, a + b + c genellikle b + c + a ile aynı değildir. Bu bir soruna neden olursa, açıklayacak bir şey yok, düzelteceğiniz bir şey var.

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.