C neden işaretsiz kayan noktalara sahip değil?


131

Biliyorum, soru tuhaf görünüyor. Programcılar bazen çok düşünüyor. Lütfen okumaya devam edin ...

CI kullanımında signedve unsignedtam sayılarda çok. İmzasız bir değişkene işaretli bir tamsayı atamak gibi şeyler yaparsam derleyicinin beni uyarması hoşuma gidiyor. İşaretli ile işaretsiz tam sayıları ve çok daha fazlasını karşılaştırırsam uyarılar alıyorum.

Bu uyarıları seviyorum. Kodumu doğru tutmama yardımcı oluyorlar.

Neden şamandıralar için aynı lüksümüz yok? Bir karekök kesinlikle hiçbir zaman negatif bir sayı döndürmez. Negatif bir kayan değerin anlamının olmadığı başka yerler de var. İmzasız bir şamandıra için mükemmel bir aday.

Btw - Şamandıralardan işaret bitini kaldırarak elde edebileceğim tek bir ekstra hassasiyet parçasına pek hevesli değilim. floatŞu anda oldukları gibi 'ler ile çok mutluyum . Ben atar gibi imzasız olarak bir float işaretlemek Bazen ben tamsayılar ile almak uyarıların aynı tür olsun.

İşaretsiz kayan noktalı sayıları destekleyen herhangi bir programlama dilinin farkında değilim.

Neden var olmadıkları hakkında bir fikriniz var mı?


DÜZENLE:

X87 FPU'nun işaretsiz kayan numaralarla başa çıkma talimatı olmadığını biliyorum. Sadece imzalı kayan nokta talimatlarını kullanalım. Yanlış kullanım (örneğin sıfırın altına inme), işaretli tamsayıların taşması tanımsız olduğu gibi tanımsız davranış olarak kabul edilebilir.


4
İlginç, imzalı tip kontrolünün yardımcı olduğu bir vaka örneği gönderebilir misiniz?

litb, yorumunuz bana mı yönelikti? eğer öyleyse, anlamıyorum

Iraimbilanja evet :) fabs negatif bir sayı döndüremez, çünkü argümanının mutlak değerini döndürür
Johannes Schaub - litb

Doğru. Farazi bir işaretsiz yüzmenin doğruya nasıl yardımcı olabileceğini sormadım. Sorduğum şey şuydu: pipenbrinck hangi durumda Int imzalı tip kontrolünü yararlı buldu (float için aynı mekanizmayı aramasına yol açtı). tip

1
Aralık içi kontrol için imzasız bir mikro optimizasyon vardır: ((işaretsiz) (p-min)) <(max-min), sadece bir dalı vardır, ancak her zaman olduğu gibi, en iyisi gerçekten yardımcı oluyor (çoğunlukla 386 çekirdekte kullandım, bu yüzden modern CPU'ların nasıl başa çıktığını bilmiyorum).
Skizz

Yanıtlar:


114

C ++ 'ın neden işaretsiz kayar sayıları desteklememesinin nedeni, CPU'nun yürüteceği eşdeğer makine kodu işlemlerinin olmamasıdır. Bu yüzden onu desteklemek çok verimsiz olur.

C ++ bunu desteklediyse, bazen işaretsiz bir şamandıra kullanıyor ve performansınızın az önce öldüğünü fark etmiyor olabilirsiniz. C ++ destekliyorsa, imzalı olup olmadığını görmek için her kayan nokta işleminin kontrol edilmesi gerekir. Ve milyonlarca kayan nokta işlemi yapan programlar için bu kabul edilemez.

Öyleyse soru, donanım uygulayıcılarının neden bunu desteklemediğidir. Ve bence bunun cevabı, orijinal olarak tanımlanmış bir işaretsiz kayan standart olmamasıdır. Diller geriye dönük uyumlu olmayı sevdiğinden diller eklenmiş olsa bile bundan yararlanamaz. Kayan nokta spesifikasyonunu görmek için IEEE standardı 754 Floating-Point'e bakmalısınız .

Negatif bir sayıyı iletmeye çalışırsanız, bir kayan nokta veya ikiye katlayan ve uyarılar atan işaretsiz bir kayan sınıf oluşturarak, işaretsiz kayan nokta türüne sahip olmadığınızdan kurtulabilirsiniz. Bu daha az etkilidir, ancak muhtemelen onları yoğun bir şekilde kullanmıyorsanız, bu küçük performans kaybını umursamayacaksınız.

İmzasız bir şamandıraya sahip olmanın faydasını kesinlikle görüyorum. Ancak C / C ++, güvenlik yerine herkes için en iyi sonucu veren verimliliği seçme eğilimindedir.


18
C / C ++, dili uygulamak için belirli makine kodu işlemleri gerektirmez. İlk C / C ++ derleyicileri 386 için kayan nokta kodu üretebilir - FPU'suz bir CPU! Derleyici, FPU talimatlarını taklit etmek için kütüphane çağrıları oluşturacaktır. Bu nedenle, ufloat CPU desteği olmadan yapılabilir
Skizz

10
Skizz, bu doğru olsa da, Brian zaten buna değindi - eşdeğer bir makine kodu olmadığı için performans, kıyaslandığında korkunç olacak.
Anthony

2
@Brian R. Bondy: Seni burada kaybettim: "çünkü CPU'nun yürüteceği eşdeğer bir makine kodu işlemi yok ...". Lütfen daha basit terimlerle açıklar mısınız?
Lazer

2
OP'nin işaretsiz yüzer ifadeler için destek istemesinin nedeni uyarı mesajları içindi, bu nedenle derleyicinin kod oluşturma aşamasıyla hiçbir ilgisi yoktur - yalnızca önceden tür kontrolünü nasıl yaptığı ile ilgilidir - bu nedenle makine kodunda onlar için destek önemsizdir ve (sorunun altına eklenmiş olduğu gibi) gerçek yürütme için normal kayan noktalı komutlar kullanılabilir.
Joe F

2
Bunun performansı neden etkilemesi gerektiğini anladığımdan emin değilim. int'S' de olduğu gibi , işaretle ilgili tüm tür denetimleri derleme zamanında gerçekleşebilir. OP, bazı anlamlı olmayan işlemlerin hiçbir zaman gerçekleştirilmediğinden emin olmak için derleme zamanı kontrolleriyle unsigned floatdüzenli olarak uygulanmasını önerir float. Ortaya çıkan makine kodu ve performansı, kayan numaralarınızın imzalı olup olmadığına bakılmaksızın aynı olabilir.
xanderflood

14

C / C ++ 'da işaretli ve işaretsiz tamsayılar arasında önemli bir fark vardır:

value >> shift

işaretli değerler üst biti değişmeden bırakır (işaret uzatma), işaretsiz değerler üst biti temizler.

İşaretsiz kayan nokta olmamasının nedeni, negatif değerler yoksa hızlı bir şekilde her türlü problemle karşılaşmanızdır. Bunu düşün:

float a = 2.0f, b = 10.0f, c;
c = a - b;

C'nin değeri nedir? -8. Ama negatif sayıların olmadığı bir sistemde bu ne anlama gelir? FLOAT_MAX - 8 olabilir mi? Aslında, bu FLOAT_MAX - 8 gibi çalışmaz, FLOAT_MAX hassas efektlerden dolayıdır, bu yüzden işler daha da karışıktır. Ya daha karmaşık bir ifadenin parçasıysa:

float a = 2.0f, b = 10.0f, c = 20.0f, d = 3.14159f, e;
e = (a - b) / d + c;

Bu, 2'nin tamamlayıcı sisteminin doğası nedeniyle tamsayılar için bir sorun değildir.

Ayrıca standart matematiksel fonksiyonları da göz önünde bulundurun: sin, cos ve tan yalnızca giriş değerlerinin yarısı için çalışır, <1 değerlerinin günlüğünü bulamazsınız, ikinci dereceden denklemleri çözemezsiniz: x = (-b +/- root ( bb - 4.ac)) / 2.a vb. Aslında, muhtemelen herhangi bir karmaşık işlev için işe yaramayacaktır, çünkü bunlar bir yerde negatif değerler kullanan polinom yaklaşımı olarak uygulanma eğilimindedir.

Yani, işaretsiz yüzer araçlar oldukça işe yaramaz.

Ancak bu, aralık değerlerini kontrol eden bir sınıfın kullanışlı olmadığı anlamına gelmez, değerleri belirli bir aralığa, örneğin RGB hesaplamalarına kenetlemek isteyebilirsiniz.


@Skizz: Temsil bir sorunsa, birisi kayan sayıları depolamak için en az bu kadar verimli bir yöntem geliştirebilirse, işaretsiz yüzerlerin olmasıyla ilgili bir sorun olmayacağını mı kastediyorsunuz 2's complement?
Lazer

3
value >> shift for signed values leave the top bit unchanged (sign extend) Bundan emin misin? En azından negatif işaretli değerler için bunun uygulama tanımlı bir davranış olduğunu düşündüm.
Dan

@Dan: Son standarda baktım ve gerçekten de uygulamanın tanımlı olduğunu belirtiyor - sanırım bu sadece işaret uzatma talimatıyla kayma hakkı olmayan bir CPU olması durumunda.
Skizz


1
kayan nokta, sarma yerine geleneksel olarak doyurur (- / + Inf). İşaretsiz çıkarma taşmasının 0.0, Inf veya NaN'ye veya muhtemelen Inf veya NaN'ye doymasını bekleyebilirsiniz . Veya soruya yapılan bir düzenlemede OP'nin önerdiği gibi sadece Tanımsız Davranış olun. Re: trig fonksiyonları: bu nedenle işaretsiz girişli sürümleri sinvb. Tanımlamayın ve dönüş değerlerini işaretli olarak değerlendirdiğinizden emin olun. Soru şamandırayı işaretsiz kayan nokta ile değiştirmeyi önermiyordu , sadece unsigned floatyeni bir tür olarak ekliyordu .
Peter Cordes

9

(Bir kenara, Perl 6 yazmanıza izin verir

subset Nonnegative::Float of Float where { $_ >= 0 };

ve sonra Nonnegative::Floatdiğer türlerde yaptığınız gibi kullanabilirsiniz .)

İmzasız kayan nokta işlemleri için donanım desteği yoktur, bu nedenle C bunu sunmaz. C çoğunlukla "taşınabilir montaj", yani belirli bir platforma bağlanmadan metale olabildiğince yakın olacak şekilde tasarlanmıştır.

[Düzenle]

C montaj gibidir: Gördüğünüz şey tam olarak ne elde edeceğinizdir. Örtük bir "Bu şamandıranın sizin için negatif olmadığını kontrol edeceğim" tasarım felsefesine aykırıdır. Gerçekten istiyorsanız, ekleyebilir assert(x >= 0)veya benzer yapabilirsiniz , ancak bunu açıkça yapmanız gerekir.


svn.perl.org/parrot/trunk/languages/perl6/docs/STATUS evet diyor, ancak of ...ayrıştırmıyor.
ephemient

8

İşaretsiz int'in, işaretli int'in sunabileceğinden daha büyük bir değer marjına ihtiyaç duyulması nedeniyle oluşturulduğuna inanıyorum.

Bir şamandıranın çok daha büyük bir marjı vardır, bu nedenle imzasız bir şamandıraya asla 'fiziksel' bir ihtiyaç olmamıştır. Ve sorunuzda kendinize işaret ettiğiniz gibi, 1 bitlik ek hassasiyet, öldürmek için hiçbir şey değildir.

Düzenleme: Brian R. Bondy'nin cevabını okuduktan sonra cevabımı değiştirmem gerekiyor: Temeldeki CPU'ların işaretsiz kayan işlemlere sahip olmadığı konusunda kesinlikle haklı. Ancak bunun yukarıda belirttiğim nedenlere dayalı bir tasarım kararı olduğuna dair inancımı sürdürüyorum ;-)


2
Ayrıca, tamsayıların toplanması ve çıkarılması aynı işaretli veya işaretsizdir - kayan nokta, çok fazla değil. Böyle bir özelliğin nispeten düşük marjinal faydası göz önüne alındığında, hem imzalı hem de işaretsiz yüzer sayıları desteklemek için ekstra işi kim yapacak?
ephemient

7

Bence Treb doğru yolda. Tamsayılar için işaretsiz karşılık gelen bir türe sahip olmanız daha önemlidir. Bit değiştirmede ve bit haritalarında kullanılanlar bunlar . Bir işaret parçası sadece yolumuza çıkıyor. Örneğin, negatif bir değeri sağa kaydırmak, ortaya çıkan değer C ++ 'da tanımlanan uygulamadır. Bunu işaretsiz bir tamsayı ile yapmak veya böyle birinin taşması, mükemmel bir şekilde tanımlanmış anlamsallığa sahiptir çünkü yolda böyle bir bit yoktur.

Bu nedenle, en azından tamsayılar için, ayrı bir işaretsiz türe olan ihtiyaç, sadece uyarı vermekten daha güçlüdür. Yukarıdaki tüm noktaların şamandıralar için dikkate alınmasına gerek yoktur. Dolayısıyla, bence onlar için donanım desteğine gerçekten ihtiyaç yok ve C zaten bu noktada onları desteklemeyecek.


5

Bir karekök kesinlikle asla negatif bir sayı döndürmez. Negatif bir kayan değerin anlamının olmadığı başka yerler de var. İmzasız bir şamandıra için mükemmel bir aday.

C99, karmaşık sayıları ve tür genel bir sqrt biçimini destekler, bu nedenle sqrt( 1.0 * I)negatif olacaktır.


Yorumcular sqrt, fonksiyondan ziyade tip-jenerik makroya atıfta bulunduğum için yukarıda hafif bir parlaklığın altını çizdi ve kompleksin kesilmesiyle skaler bir kayan nokta değerini gerçek bileşenine döndürecek:

#include <complex.h>
#include <tgmath.h>

int main () 
{
    complex double a = 1.0 + 1.0 * I;

    double f = sqrt(a);

    return 0;
}

Ayrıca, herhangi bir karmaşık sayının sqrt'sinin gerçek kısmı pozitif veya sıfır olduğundan ve sqrt (1.0 * I) sqrt (0.5) + sqrt (0.5) * I, -1.0 olmadığından, bir beyin osuruğu içerir.


Evet, ancak karmaşık sayılarla çalışıyorsanız farklı bir adla bir işlevi çağırırsınız. Ayrıca dönüş türü farklıdır. Yine de iyi bir nokta!
Nils Pipenbrinck

4
Sqrt (i) 'nin sonucu karmaşık bir sayıdır. Ve karmaşık sayılar sıralı olmadığından, karmaşık bir sayının
negatif

1
quinmars, csqrt olmadığından emin misiniz? yoksa C yerine matematikten mi bahsediyorsun? yine de bunun iyi bir nokta olduğuna katılıyorum :)
Johannes Schaub - litb

Doğrusu ben matematikten bahsediyordum. C'deki karmaşık sayılarla hiç ilgilenmedim.
quinmars

1
"karekök kesinlikle hiçbir zaman negatif bir sayı döndürmez." -> sqrt(-0.0)sıklıkla üretir -0.0. Elbette -0.0 negatif bir değer değil .
chux - Monica'yı yeniden etkinleştir

4

Sanırım bu, yalnızca IEEE kayan nokta özelliklerinin imzalanmış olmasına ve çoğu programlama dilinin bunları kullanmasına bağlı.

IEEE-754 kayan noktalı sayılarla ilgili Wikipedia makalesi

Düzenleme: Ayrıca, başkalarının da belirttiği gibi, çoğu donanım negatif olmayan kaymaları desteklemez, bu nedenle donanım desteği olduğundan normal türdeki kaymalar daha etkilidir.


C, IEEE-754 standardı ortaya çıkmadan çok önce tanıtıldı
phuclv

@phuclv Ne sıradan bir kayan nokta donanımı değildi. "Birkaç" yıl sonra standart C'ye uyarlandı. Muhtemelen bu konuda internette dolaşan bazı belgeler vardır. (Ayrıca, wikipedia makalesinde C99'dan bahsedilmektedir).
Tobias Wärre

Ne demek istediğini anlamıyorum. Cevabınızda "donanım" yok ve IEEE-754 C'den sonra doğdu, bu nedenle C'deki kayan nokta türleri, C'ye daha sonra tanıtılmadıkça IEEE-754 standardına bağlı olamaz
phuclv

@ phuclv C aynı zamanda taşınabilir montaj olarak da biliniyordu, bu nedenle donanıma oldukça yakın olabilir. Diller yıllar içinde özellik kazanıyor, float (benim zamanımdan önce) C'de uygulanmış olsa bile, muhtemelen yazılım tabanlı bir işlemdi ve oldukça pahalıydı. Bu soruyu cevaplarken, açıklamaya çalıştığım şeyi şimdi yaptığımdan daha iyi anladım. Kabul edilen cevaba bakarsanız, neden IEE754 standardından bahsettiğimi anlayabilirsiniz. Anlayamadığım şey, kabul edilmeyen 10 yıllık bir cevaba mızmızlanmanız mı?
Tobias Wärre

3

Bence ana neden, işaretsiz yüzerlerin, işaretsiz girişlere kıyasla gerçekten sınırlı kullanımlara sahip olmasıdır. Donanımın onu desteklememesi argümanına inanmıyorum. Daha eski işlemcilerin hiçbir kayan nokta yeteneği yoktu, hepsi yazılımda taklit ediliyordu. İmzasız şamandıralar yararlı olsaydı, önce yazılıma yerleştirilirlerdi ve donanım da bunu takip ederdi.


4
C'nin ilk platformu olan PDP-7, isteğe bağlı bir kayan nokta birimi donanımına sahipti. C'nin bir sonraki platformu olan PDP-11, donanımda 32 bitlik kayan noktalara sahipti. 80x86, geride bir nesil olan bazı teknolojilerle bir nesil sonra geldi.
ephemient

3

C'deki işaretsiz tamsayı türleri, soyut bir cebirsel halkanın kurallarına uyacak şekilde tanımlanır. Örneğin, herhangi bir X ve Y değeri için XY'nin Y'ye eklenmesi X sonucunu verecektir. İşaretsiz tam sayı türlerinin, başka herhangi bir sayısal türe [veya farklı boyutlarda işaretsiz türlere] dönüştürülmeyi içermeyen tüm durumlarda bu kurallara uyması garanti edilir. ve bu garanti, bu tür tiplerin en önemli özelliklerinden biridir. Bazı durumlarda, yalnızca imzasız türlerin sağlayabileceği ekstra garantiler karşılığında negatif sayıları gösterme yeteneğinden vazgeçmeye değer. Kayan nokta türleri, işaretli olsun ya da olmasın, bir cebirsel halkanın tüm kurallarına uyamazlar [örneğin, X + YY'nin X'e eşit olacağını garanti edemezler] ve aslında IEEE uymaz ' hatta bir denklik sınıfının kurallarına uymalarına bile izin verin [belirli değerlerin kendileriyle eşitsizliği karşılaştırmasını şart koşarak]. "İşaretsiz" bir kayan nokta türünün sıradan bir kayan nokta türünün yapamayacağı herhangi bir aksiyoma uyabileceğini sanmıyorum, bu yüzden ne gibi avantajlar sunacağından emin değilim.


1

IHMO, hem donanım hem de yazılımda hem imzalı hem de işaretsiz kayan nokta türlerini desteklemek çok zahmetli olacağından

Tamsayı türleri için biz kullanabileceği aynı mantık birimini hem işaretli ve işaretsiz tamsayı işlemleri nedeniyle, 2'nin tamamlayıcı güzel özelliğini kullanarak çoğu durumda sonuç durumlarda aynıdır olmayan genişletme mul, eklenti, alt ve en bit seviyesinde işlemler. İmzalı ve imzasız sürüm arasında ayrım yapan işlemler için , mantığın çoğunu yine de paylaşabiliriz . Örneğin

  • Aritmetik ve mantıksal kayma, üst bitler için doldurucuda sadece küçük bir değişikliğe ihtiyaç duyar
  • Çarpmayı genişletmek, ana parça için aynı donanımı kullanabilir ve ardından sonucu değiştirmek için farklı bir mantık kullanabilir. . Gerçek çarpanlarda kullanıldığından değil, yapmak mümkün
  • İmzalı karşılaştırma, üst biti değiştirerek veya ekleyerekINT_MIN imzasız karşılaştırmaya ve tersi kolayca dönüştürülebilir . Ayrıca teorik olarak mümkün, muhtemelen donanımda kullanılmıyor, ancak yalnızca tek bir karşılaştırma türünü destekleyen sistemlerde kullanışlıdır (8080 veya 8051 gibi)

1'in tamamlayıcısını kullanan sistemler, mantıkta küçük bir değişikliğe ihtiyaç duyar çünkü bu, en az önemli bite sarılmış taşıma bitidir. İşaret büyüklüğü sistemleri hakkında emin değilim, ancak dahili olarak 1'in tümleyicisini kullanıyorlar gibi görünüyor, dolayısıyla aynı şey geçerli

Maalesef kayan nokta türleri için bu lüksümüz yok. Sadece işaret bitini serbest bırakarak imzasız sürüme sahip olacağız. Ama o zaman bu kısmı ne için kullanmalıyız?

  • Üsye ekleyerek aralığı artırın
  • Duyarlılığı mantise ekleyerek artırın. Bu, genellikle aralıktan daha fazla hassasiyete ihtiyacımız olduğundan daha kullanışlıdır.

Ancak her iki seçeneğin de daha geniş değer aralığına uyum sağlamak için daha büyük bir toplayıcıya ihtiyacı vardır . Toplayıcının üst biti çoğu zaman kullanılmadan orada dururken bu, mantığın karmaşıklığını artırır. Çarpmalar, bölmeler veya diğer karmaşık işlemler için daha da fazla devreye ihtiyaç duyulacaktır.

Yazılım kayan nokta kullanan sistemlerde, belleğin çok pahalı olduğu zamanlarda beklenmeyen her işlev için 2 sürüme ihtiyacınız vardır veya işaretli ve işaretsiz işlevlerin parçalarını paylaşmanın "zor" bir yolunu bulmanız gerekir.

Ancak kayan noktalı donanım, C icat edilmeden çok önce vardı , , bu yüzden C'deki seçimin, yukarıda bahsettiğim nedenden dolayı donanım desteğinin eksikliğinden kaynaklandığına inanıyorum.

Bununla birlikte, Khronos grubunun 10 ve 11 bit kayan nokta türü gibi, özellikle görüntü işleme amaçları için birkaç özel işaretsiz kayan nokta biçimi vardır.


0

C derleyicileri tarafından hedeflenen temel işlemcilerin işaretsiz kayan noktalı sayılarla başa çıkmanın iyi bir yolu olmadığından şüpheleniyorum.


Temel işlemciler, imzalı kayan noktalı sayılarla başa çıkmak için iyi bir yönteme sahip miydi? Kayan noktalı yardımcı işlemciler kendine özgü ve neredeyse evrensel olmadığında C popüler hale geliyordu.
David Thornley

1
Tüm tarihsel zaman çizelgelerini bilmiyorum, ancak sizin de belirttiğiniz gibi nadir de olsa, imzalı yüzerler için yeni donanım desteği vardı. Derleyici arka uçları, hedeflenen mimariye bağlı olarak değişen düzeylerde destek sunarken, dil tasarımcıları bunun için destek ekleyebilir.
Brian Ensink

0

İyi soru.

Dediğiniz gibi, yalnızca derleme zamanı uyarıları içinse ve davranışlarında değişiklik yoksa, aksi takdirde temeldeki donanım etkilenmez ve bu nedenle yalnızca bir C ++ / Derleyici değişikliği olur.

Daha önce de aynısını kazandım, ama mesele şu ki: Çok yardımcı olmaz. En iyi durumda, derleyici statik atamaları bulabilir.

unsigned float uf { 0 };
uf = -1f;

Veya minimalist olarak daha uzun

unsigned float uf { 0 };
float f { 2 };
uf -= f;

Ama bununla ilgili. İşaretsiz tamsayı türleri ile ayrıca tanımlanmış bir sarmalama elde edersiniz, yani modüler aritmetik gibi davranır.

unsigned char uc { 0 };
uc -= 1;

bundan sonra 'uc' 255 değerini tutar.

Şimdi, bir işaretsiz kayan tip verildiğinde, bir derleyici aynı senaryo ile ne yapar? Değerler derleme sırasında bilinmezse, önce hesaplamaları yürüten ve ardından bir işaret kontrolü yapan kod üretmesi gerekir. Peki ya böyle bir hesaplamanın sonucu "-5.5" olduğunda - işaretsiz ilan edilen bir floatta hangi değer saklanmalıdır? İntegral türleri gibi modüler aritmetik denenebilir, ancak bu kendi problemleriyle birlikte gelir: En büyük değer tartışmasız sonsuzdur ... bu işe yaramaz, "sonsuz - 1" olamaz. Sahip olabileceği en büyük farklı değeri elde etmek de gerçekten işe yaramayacaktır çünkü orada hassasiyetle karşılaşırsınız. "NaN" bir aday olacaktır.

Son olarak, modulo iyi tanımlandığı için bu sabit nokta numaralarında sorun olmaz.

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.