2013-02-25 20 views
5

µL cinsinden sıvı hacimlerini izliyorum bir uygulamam var. Şu anda sistem genelinde birimlerin depolanması için 'çift' kullanıyorum ve bu çoğu durumda iyi çalışıyor. Bununla birlikte, bu hacimlerin büyük sayılarını eklemeye ve çıkarmaya başladığımda, çeşitli birikim hataları içeri girmeye başlar. Hatalar büyüklük olarak çok küçüktür, fakat eşik değerleriyle problemlere neden olurlar, bu durumda aniden hacim beklenenden daha azdır, doğrulama hatalarına neden oluyor. Bunun, biriken kayan nokta işlemlerini gerçekleştirmede oldukça yaygın bir sorun olduğunu anlıyorum, ancak sorunları en iyi nasıl çözeceğimi merak ediyorum. Bir kaç düşünce yaşadım:Yuvarlama/birikme hatalarıyla kolayca ilgileniyor

  1. Bütün çift referanslarımı tamsayılarla değiştirebilirim ve nL'deki her şeyi takip edebilirim. Bu kesinlikle sorunu çözecektir, ama çok invaziv bir değişim. Sistem henüz üretimde kullanılmamaktadır, bunun anlamı şimdi uygulamak, daha sonra uygulamaktan çok daha kolay olacaktır.

  2. Çift yerine Ondalık kullanabilirim. Bu tamsayılara geçmek yerine daha az invaziv, ancak yine de oldukça önemli değişiklikler gerektirir.

  3. Tüm birim karşılaştırmalarının belirli bir hata toleransı için izin vermesini isteyebilirim. Bu, şu anda yaptığım şeydir, fakat karşılaştırma kodunu çirkin kılar ve hiç kimsenin kalıbı uygulamayı unutmamasını sağlamak için bir kod gözden geçirmesi gerekir.

  4. Hata birikimini önlemek için her hesaplamadan sonra belirli bir toleransa yuvarlama gerçekleştirebilirim. Bu karşılaştırmaları daha temiz hale getirir, ancak şimdi her yerde benzer görevler vardır.

Bu sorunla da mücadele edenler için, hangi çözümlerin en temiz olduğu belirlendi? Birikimli hesaplamalar yaparken bilmem gereken başka tuhaflıklar var mı?

+0

Yan not: bir şey ile çift değiştirmeye karar verirseniz - yerine 'decimal' /' long' özel sınıf düşünün. Kodlama maliyeti yaklaşık olarak aynı olurdu, ancak temsil üzerinde kontrol sahibi olursunuz ve herhangi bir otomatik dönüşüm sağlamazsa istenmeyen sayıları normal sayısal türlere engelleyebilir. –

+2

Neredeyse kesinlikle yapmak istemiyorsunuz # 4, # 3 çok daha fazla tercih edilir. # 4 her operasyona, sahip olduğunuzdan daha büyük bir hata potansiyeli veriyor, bu da çok kötü olabilir. – Servy

+0

Oy vermemin ayrılmaz bir türü var - belki de Alexei'nin önerdiği gibi. –

cevap

1

İdeali, istediğiniz

  • kullanım yuvarlama (yaklaştırma) hataya tabi olmayan bir veri türü ve doğru zamanda ondalık basamak sağ sayıda
  • -
  • tura.

Çok hassas bir çift yüzlüye ihtiyaç duymazsınız. muhtemelen tamsayıları kullanmak istemezsiniz. Biraz daha hızlılar, ama onları kullanmak daha karmaşık. Sayı veya ondalık kullanın. Sayısal ve ondalık veri türleri, yuvarlama hatalarına veya yaklaşıklık hatalarına tabi değildir. Fakat programınızda hala dikkatsiz veya özensiz olamazsınız; çift ​​tipli bir değişkene sayısal bir değer atamak problemi size geri getirir. ondalık basamağa ve ortalama Başvurunuzun bağlıdır doğru zaman doğru sayıda Tam olarak ne

. Doğru ondalık basamak sayısı, bazen son değeriniz olarak depolamanız gereken yer sayısından daha fazla olabilir. Doğru zaman, ara hesapların sayısı ve niteliğinden etkilenebilir.

Bazen, insanlar hata yuvarlama dediğimiz gerçekten yaklaşım hatası olduğunu.Bilgisayarınızın bir kayan nokta değişkenine veya veritabanı sütununa r onluk değerini depolamasını söylerseniz, en yakın kayan nokta yaklaşımını r'a kaydeder.

Canonical reference for FP arithmetic

+0

İlginç bağlantı için teşekkürler; felaket iptali, özellikle de ikinci dereceden kökler için çözdüğüm yerdeyim. Hassasiyetin hesaplama sırasından ne kadar önemli ölçüde etkilenebileceği hakkında hiçbir fikrim yoktu. –

+0

Knuth, TAOCP, vol 2'de bu konu hakkında söylenecek çok şey var. –

+0

Ondalık kullanmak için tüm birim referanslarını değiştirmeye ve çözülmüş şeyleri güzelce yaraıyorum. C# 'ye iki katına açık bir dönüşüm gerektirir, bu yüzden dönüşüm sınırının çaprazlandığı kod boyunca çok net bir şekilde görünür. Bu, çift yerine ondalık basamakta çalışan yinelenen matematik yardımcısı işlevlerinin yaratılması anlamına geliyordu, ancak bu, biriken hataları önlemek için makul bir ek yük. –

İlgili konular