Double alanda -NAN hatası Hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Double alanda -NAN hatası Hakkında

Mesaj gönderen adelphiforumz »

Selamlar

Versiyon olarak Berlin kullanıyorum
Aşağıdaki gibi bir işlem yaptığımı varsayalım.

Kod: Tümünü seç

....
...
var
  _d : Double;
begin
   _d := (0 * 0) / 0; 
end;
yukarıdaki şekilde bir işlem olduğunda normalde bu satır exception oluşuşturur.
fakat garip olan exeption oluşmuyor ve _d değerinin içine baktığımda -NAN olarak değer görünüyor
Bunun nedeni nedir ve nasıl çözülebilir.

Teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Double alanda -NAN hatası Hakkında

Mesaj gönderen ertank »

Merhaba,

Aşağıdaki linkte Sayfanın yaklaşık 1/3 ü gibi bir konumda "Infinity" başlığını okursanız okursanız daha iyi anlayabilirsiniz. Özele, tek işlemde yapılmaya çalışılan "floating point" operasyonları sonlanamayabilir. Bu durumda -NaN veya +NaN değer içerirler.
What Every Computer Scientist Should Know About Floating-Point Arithmetic: https://docs.oracle.com/cd/E19957-01/80 ... dberg.html

Aşağıdaki gibi iki işlem ile yapılır ise hata alırsınız:

Kod: Tümünü seç

var
  _d : Double;
begin
  _d := 0 * 0;
  _d := _d / 0;
end;
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Double alanda -NAN hatası Hakkında

Mesaj gönderen adelphiforumz »

Selamlar

"ertank" hocam bu hata XE7 ve altındaki versiyonlarda denediğimde değeri 0 olarak kabul ediyor
Fakat XE10 da derlediğimde değer NAN/-NAN oluyor ve projeyi kilitliyor.
Eğer projenin başka yerlerindede böyle hatalar varsa bunu parametre olarak yapan bir şey varmıdır acaba
delphinin ayarlarında mesela compiler NAN/-NAN değerini 0 kabul et gibi mesala

Teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Double alanda -NAN hatası Hakkında

Mesaj gönderen ertank »

Çok yüksek ihtimal ile Embarcadero XE7'deki hatayı ileriki sürümlerde düzeltmiştir. Kullandığınız XE7 Update 1 sürümü mü? Yoksa ilk çıkan sürümü mü acaba? Şu anda kullanabileceğim XE7 yok eğer bir tane bulabilirsem örnek kodu test edeceğim.

NAN sadece Pascal dilinde kullanılmıyor. C ve benzeri dillerde de mevcut olan bir tanımdır. Ayrıca, Delphi Math unitesi içinde bir değerin NAN olup olmadığını anlamak için IsNan() fonksiyonu tanımlamıştır. Herhangi bir rakamın sıfıra bölünmesi hata olur iken sıfırın sıfıra bölünmesi NAN olarak tanımlanmıştır. Hatta NAN değerleri kendi içlerinde sınıfa ayrılmıştır (QNaN - Quiet Nan, SNaN - Signaling Nan vb).

Sizin istediğiniz "NAN / -NAN değerini sıfır olarak kabul etme" için bilgim dahilinde kendinizin bir fonksiyon içinde kontrolü ya da yukarıda belirttiğim Math.IsNan() fonksiyonunu kullanarak oluşan sonuçları kontrol etmeniz gerekir.

Kod: Tümünü seç

uses
  Math;

var
  DoubleTest: Double;
begin
  DoubleTest := 0 / 0;
  if Math.IsNan(DoubleTest) then DoubleTest := 0;
end;
veya fonksiyon kullanmak isterseniz:

Kod: Tümünü seç

uses
  Math;

function SetZeroIfNan(const Value: Double): Double;
begin
  if Math.IsNan(Value) then Exit(0);
  Result := Value;
end;
Kullanımı aşağıdaki gibi olacaktır

Kod: Tümünü seç

var
  DoubleTest: Double;
begin
  DoubleTest := 0 / 0;
  DoubleTest := SetZeroIfNan(DoubleTest);
end;
Bunlar dışında benim bildiğim "NAN değerini sıfır kabul et" şeklinde bir derleyici parametresi şu an için yok.

Son olarak, neden kullandığınız kod içinde düzeltme yoluna gitmiyorsunuz? Böylece ekrana hata mesajı çıkmasını da engellemiş olursunuz. Hata oluşmadan yanlış hesaplanmış değerler göstermenin de önüne geçmiş olursunuz.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Double alanda -NAN hatası Hakkında

Mesaj gönderen ertank »

XE7 Update 1 ile test etme imkanı buldum. Bu sürümde de aşağıdaki kod hata vermiyor ve ekrana NAN değerini gösteriyor.

Kod: Tümünü seç

var
  D: Double;
begin
  D := 0 / 0;
  ShowMessage(FloatToStr(D));
end;
XE7 orjinal sürüm ile sonuç nasıl olur bilemiyorum.

Sizin bahsettiğiniz XE7 ile hata veriyor ifadesi acaba benim ilk cevabımdaki gibi bir işlem olmasından kaynaklanıyor olabilir mi? Daha önce de açıklamaya çalıştığım gibi -NAN ve NAN değerleri bir noktada derleyici bağımsız global kullanımdır diye düşünülmeli.
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Re: Double alanda -NAN hatası Hakkında

Mesaj gönderen m_ekici »

Merhaba

bu NAN hatasını bende almaya başladım.
Fakat bende herhangi bir bölme işlemi yok? XML den okuduğum bilgileri kbmMEMTable a aktarıyorum. cxGridde sayı görünüyor fakat o hücreye tıkladığımda NAN yazıyor. Bu nedir, ve nasıl çözülür? (alanları okurken isNAN ise 0 atıyorum)

Delphi Tokyo 10.2
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Double alanda -NAN hatası Hakkında

Mesaj gönderen freeman35 »

var
D: Double;
begin
D := 0.0 / 0.0;
denedin mi? baya bir zaman önce delphi 2-7 arasında bir yerlerde küsüratlarla alakalı bir saçma durum çıkmıştı. Hint ile bakınca 0 yazıyordu ama, ondalık kısmın max hanesinde değer görüyordu. tam boyutu hatırlayamadım. Ozamandan alışkanlık ben değişkenlere mutlaka ön değer atarım ondalıklı olanlara mutlaka 0.0 şeklinde default değer atarım.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Cevapla