Bilgisayarların artık matematik işlemleri için aynı sonucu almasını garanti etmek için hala sabit nokta kullanmam gerekiyor mu?


9

Modern bilgisayarların çoğunun aynı kayan nokta standardını takip ettiği söylendi, bu, girişler aynı ise, verilen bir matematik işlemi için hepsinin aynı float cevabı alacağı anlamına mı geliyor?

Soruyorum çünkü bir ağda RTS oyunu yapmak için araştırma yapıyorum ve yüzlerce ünitenin pozisyonlarını senkronize etmek kötü bir yol gibi geliyor.

Sadece girişler gönderirsem, bu istemcilerin simülasyonlarını bu girişlerden çalıştırmasını sağlayarak tüm istemcileri aynı sonucu elde etmeyi garanti etmeliyim.

Eski RTS oyunları sabit nokta aritmetik kullanılan okudum, ama hepsi aynı standarda uyuyorsa modern bilgisayarlarda hala gerekli olup olmadığını bilmiyorum? Ayrıca kesin olmamasına rağmen, kayan nokta sonucunun aynı girdi için deterministik olduğu söylendi (ki aynı standardı takip eden herhangi bir bilgisayarın aynı kesin sonucu elde ettiği anlamına mı geliyor?).

Aynı kayan nokta standardını izleseler bile bilgisayarlarda hala sapmalar var mı?

Bu oyunu C # yazıyorum ama bu önemli olsa emin değilim, yine de bahsettiğim düşündüm.



Ne demek istiyorsun ? Neden olmasın?
WDUK

Şamandıraların kullanımı yine de istenmeyen olabilir, çünkü davranış haritadaki pozisyona bağlı olabilir. Minecraft'ın Uzak Toprakları daha dikkate değer bir örnektir: hareket, render ve arazi üretimi, yumurtlama noktasından uzaklaştıkça glitchy olur.
amon

Yanıtlar:


18

Aynı kayan nokta standardını izleseler bile bilgisayarlarda hala sapmalar var mı?

Ne yazık ki, evet, özellikle C # (veya başka bir JIT derlenmiş dili) kullandığınızda. Burada ortaya çıkan sorun, bazı işlemci mimarilerindeki JIT derleme aşamasının diğer mimarilerden daha fazla CPU kaydı kullanan kod üretmesidir. Bu, bazı makinelerde, belirli işlemler için uzatılmış kayar nokta hassasiyetinin kullanıldığı, diğer makinelerde kullanılmadığı durumlara yol açabilir . Bu, çiftleri kullanan her yinelemeli hesaplama için, farklı birikmiş yuvarlama hataları üretme şansı olduğu anlamına gelir.

Bu varsayımsal bir sorun değil, çağdaş mühendislik simülasyon yazılımında, az ya da çok modern donanımda bu tür sapmalarla ilk elden deneyimim var. Bu sorun, ilgili tüm makinelerde tam olarak aynı sonucu veren karmaşık kayan nokta hesaplamaları için güvenilir regresyon testleri oluşturmayı gerçekten zorlaştırmaktadır.


Bu. Bazı temel nedenler: IEEE Std 754 isteğe bağlı "gerekir" yan tümcelerini (örn. NaN işleme) içerir ve tasarım alternatiflerine izin verir (örn. Düşük akış algılama). Dil bağlamaları kayan nokta standardını desteklediğinde, kayan nokta ifadelerini değerlendirirken derleyiciye yine de boşluk bırakabilir, örneğin FLT_EVAL_METHODISO C / C ++. Transandantal fonksiyonlar (örn sin. exp, log) Hem IEEE kayan nokta standardı hem de programlama dili standartları tarafından büyük ölçüde düzenlenmemiştir. Basit bir kitaplık sürümü yükseltmesi (örn. Yeni bir glibcsürüm) sonuçların farklı olmasına neden olabilir.
njuffa

Bir oyunda kendime vurdum. Roket dizüstü bilgisayarımda iyi uçtu, masaüstümde uçmazdı, tamamen aynı kurulumlar.
Loren Pechtel

3

Kayan Nokta Hataları

Her kayan nokta sayısı hesaplama için kullanıldığından kesinliği biriktirir. Bu, hesaplamak için kesin olmayan bir biçim kullanmanın basit bir gerçeğidir. Hesaplamalar, hesaplama sırasına da duyarlıdır, değişebilirlik garanti edilmez, yani: ile (a + b) + caynı olabilir veya olmayabilir a + (b + c).

Ek olarak işlemcilerin bellek standardı ile aynı mantis uzunluğuna sahip olması gerekmez. Bu, 32/64/128 bit şamandıra zaman zaman daha fazla bite sahip gibi çalıştığından ilginç bir davranış oluşturabilir.

Sabit Nokta Hataları

Sabit nokta aritmetiğinin söylenmesi de hataları biriktirebilir. Fark, sabit nokta numaralarının hangi hassasiyetin kaybolduğu konusunda net olması ve seçilen işlemlere bağlı olarak yuvarlama hatalarını tamamen önleyebilmesidir. Ayrıca değişmeli (a + b) + c = a + (b + c).

Hangi?

Hangisini kullanmanız tamamen ihtiyacınız olan özelliklere bağlıdır.

Kayan nokta sayıları:

  • çok ince taneli hale gelen çok çeşitli değerler verir ve uç noktalarda giderek daha da ayrılır.
  • hesaplama sırasına duyarlıdır
  • zaman içinde yuvarlama hataları biriktirir.
  • donanım / bellek kayan boyutu uyuşmazlığı nedeniyle hatalı davranışlar gösterebilir.

Sabit Nokta numaraları:

  • birbirini takip eden iki sayı arasında aynı mesafeye sahip daha küçük bir sayı aralığı verin.
  • hesaplama sırasına daha az duyarlıdır
  • Yuvarlama hataları hakkında daha net
  • yuvarlama sorunlarını en aza indirmek / önlemek için çalışılabilir.

1
"sabit nokta sayıları kesinliğin ne kadar kaybolduğu konusunda açıktır" - kayan noktalar da açıktır, fark oldukça sabit nokta yanlışlıkları sıradan yaşam numaralandırması için daha sezgiseldir
whatsisname

1
Yani sadece sabit nokta donanım vb ne olursa olsun tüm bilgisayarları garanti aynı hataları / hassas kaybı yaşayacak?
WDUK

1
Temel olarak, evet, çünkü sabit nokta numaralarınızın 32 veya 64 bit olduğunu belirtebilirsiniz ve tüm sistemlerde olacaktır. Kayan nokta sayısı 32 veya 64 bit olabilir, ancak donanım aslında hesaplama yapmak için 48 veya 96 bit kullanabilir ve sonunda farklı donanım türleri arasında farklarla sonuçlanan 32 veya 64 bite dönüşebilir.
user1118321

kayan nokta spesifikasyonları oldukça açık olmakla birlikte bu miktar karşılaşacakları yuvarlama Hangi sorunların @whatsisname, kolayca söyleyemezsin: (a + b * c) / d - e. NaNSıfıra bölme veya taşma / taşma gibi bariz sorunlar dışında bu ifadenin yanlış olması mümkündür. Buna ek olarak, bellek ve kayıt arasındaki kesinlik açısından engelleme ve hatta "aynı" kayan nokta değerinin belleğinden basit bir yükleme / depolama yanıtı da değişecektir.
Kain0_0

@ Kain0_0: haklısın, sana ne karşılaşacağımı kolayca söyleyemem, çünkü kayan nokta uzmanı değilim. "Sıradan yaşam numaralandırmasına daha sezgisel" dediğimde tam olarak bu kastedilmektedir. Sabit noktanın "açık" olduğunu ve kayan noktanın olmadığını söylediğinizde, şamandıralar sanki rastgele rastgele yanlışmış gibi ses çıkarırsınız.
whatsisname

-1

Aynı sonuçları neden garanti etmek isteyeceğiniz sorusu vardır, çünkü aynı sonuçlar sonuçlarınızın yararlı olduğuna dair hiçbir garanti vermez .

Farklı bilgisayarlarda aynı ancak tamamen saçma iki sonuç veren sayısal olarak dengesiz bir algoritmaya sahip olabilirsiniz. Farklılıklar varsa, ancak sonuçlar 13 basamakta aynıysa, bu çok daha güvenilirdir.

Tekrarlanabilirliğin gerçekten önemli olduğu çok az durum vardır: bir düzen motorunda veya kayıpsız sıkıştırma / açma. Sabit nokta kullanmanın yanlış yönlendirilmesi muhtemeldir.


Cevabınızı küçümsemedim, ancak OP tarafından açıklanan durum tam olarak "tekrarlanabilirliğin gerçekten önemli olduğu birkaç durumdan biri" gibi görünüyor. Bir RTS oyununda, küçük bir yuvarlama hatası "çarpışan iki nesne" arasındaki farkı yaratabilir veya değiştiremez.
Doc Brown
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.