SORU
13 Temmuz 2011, ÇARŞAMBA


C kayan nokta sayısı matematik tutarlıdır# platformlarında?

Hayır, bu başka bir şeydir"Neden (1/3.0)x3 != ". 1.0 soru.

Kayan noktaları hakkında son zamanlarda çok okuyorum; özellikle, nasılaynı hesaplama farklı sonuçlar verebilirmimarileri veya optimizasyon ayarları farklı.

Bu sorun için video oyunları hangi mağaza tekrarları, veya peer-to-peer networked (karşıt olarak sunucu-istemci) kullanan tüm istemciler üreten aynı sonuçlar her zaman çalıştırmak programı - küçük bir farklılık, bir kayan nokta hesaplama açabilir için bir ölçüde farklı oyun-devlet üzerinde farklı makine (veya bile on the same machine!)

Bu bile işlemciler arasında gerçekleşen "takip" öncelikle bazı işlemciler (yani) 86 double extended precision çünkü IEEE-754,. Yani, kullandıkları 80-bit kayıt için tüm hesaplamaları, sonra kesmek için 64 veya 32-bit, lider için farklı sonuçlar daha yuvarlama makineleri kullanın 64 veya 32 - bit için hesaplamalar.

Bu sorun için çeşitli çözümler online gördüm, ama C , C#:

  • Uzatılmış-hassas modu double tüm hesaplamaları IEEE-754 64-bit kullanmak () _controlfp_s (Windows) _FPU_SETCW (Linux?) kullanarak çift, ya fpsetprec (BSD).
  • Hep aynı optimizasyon ayarları ile aynı derleyici çalıştırmak ve tüm kullanıcılar aynı CPU gerektirir mimarlık (no-çapraz platform oyunu). Benim "derleyici" aslında olan JİT,farklı program her zaman en iyi duruma getirmekBunun mümkün olduğunu sanmıyorum.
  • Sabit noktalı aritmetik, ve float double tamamen önlemek kullanın. decimal bu amaç için çalışır, ama çok daha yavaş olur ve System.Math kütüphane fonksiyonları hiçbiri destek.

Yanibu bile bir sorun olduğunu#?Eğer sadece Windows (değil) Mono desteklemek istiyorsanız, ne?

Eğer o isebenim program normal bir çift duyarlıklı çalışmaya zorlamak için herhangi bir yolu var mı?

yardımcı olacak herhangi bir kütüphaneleri varkayan nokta hesaplamaları tutarlı tutmak?

CEVAP
13 Temmuz 2011, ÇARŞAMBA


Yol için hiçbir şekilde normal kayan puan deterministik yapmak için biliyorum .net. Jetta farklı farklı platformlarda(veya farklı sürümleri arasında .üzerinde davranan bir kod oluşturmak için izin verilir net). Yani normal kullanma floatdeterministik .net kod mümkün değildir.

Ben kabul geçici çözümler:

  1. C FixedPoint32 uygulamak#. Bu çok zor(yarısı bitmiş bir uygulama var) ise değerleri çok küçük bir aralık can sıkıcı. Her zaman dikkatli olmak zorunda, ne taşma, ne de çok fazla hassas kaybedersin. Sonunda bu daha kolay doğrudan tamsayılar kullanarak daha buldum.
  2. C FixedPoint64 uygulamak#. Bu oldukça zor bir iş buldum. Bazı işlemler için 128 bit Ara tamsayılar faydalı olacaktır. Ama .net bu tür sunmuyor.
  3. 32 bit kayan nokta özel bir uygulama. Bir BitScanReverse içsel eksikliği bu uygularken birkaç can sıkma neden olur. Ama şu anda bu en umut verici yol olduğunu düşünüyorum.
  4. Matematik işlemleri için yerel kod kullanın. Her matematik işlemi temsilci çağrısının yükü doğurur.

Sadece 32 bit yazılım uygulaması kayan nokta matematik başladım. 70million eklemeler hakkında 2.66 GHz i3 saniyede/çarpım yapabilirsiniz. https://github.com/CodesInChaos/SoftFloat . Belli ki hala çok eksik ve hatalı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Smith

    Bryan Smith

    12 Mart 2006
  • dougownsall

    dougownsall

    7 EKİM 2007
  • Noam Erez

    Noam Erez

    3 NİSAN 2012