Lua hem tamsayı hem de kayan sayıları nasıl işler?


11

Programladığımı hatırladığım kadarıyla, eşitlik için kayan nokta sayılarını karşılaştırmamam öğretildi. Şimdi, Lua'da Lua numbertürü hakkında Programlama okurken aşağıdakileri buldum:

Sayı türü gerçek (çift kesinlikli kayar nokta) sayıları temsil eder. Lua'nın ihtiyaç duymadığı için tamsayı tipi yoktur. Kayan nokta aritmetik hataları hakkında yaygın bir yanlış anlama vardır ve bazı insanlar basit bir artışın bile kayan nokta sayılarıyla garip olabileceğinden korkarlar. Gerçek şu ki, bir tamsayıyı temsil etmek için bir çift kullandığınızda, hiçbir yuvarlama hatası yoktur (sayı 100.000.000.000.000'dan büyük olmadığı sürece). Özellikle, bir Lua numarası yuvarlama problemi olmadan herhangi bir uzun tamsayıyı temsil edebilir. Ayrıca, modern CPU'ların çoğu tam sayı aritmetiği kadar hızlı (hatta daha hızlı) kayar nokta aritmetiği yapar.

Bu tüm diller için geçerli mi? Temel olarak eğer iki katına kayan noktanın ötesine geçmezsek, tamsayı aritmetiğinde güvende olur muyuz? Veya soru başlığı ile daha uyumlu olmak için, Lua'nın numbertürüyle yaptığı özel bir şey var mı, bu yüzden hem tamsayı hem de kayan nokta tipi olarak iyi çalışıyor?



@JoonasPulakka teşekkürler, bu oldukça değerli bir ek.
Petr Abdulin

Yanıtlar:


11

Lua, kayan nokta sayılarının tam sayı türlerini tam sayı türlerini temsil edebileceğini iddia ediyor ve ben de aynı fikirdeyim. Üzerinde durulması gereken kesirli bir sayısal parçanın kesin bir temsili yoktur. Bir tamsayıyı tamsayı tipinde saklayın ya da kayan nokta numarasının mantisinde saklayın, sonuç aynıdır: mantis içindeki bit sayısını aşmadığınız sürece bu tamsayı tam olarak temsil edilebilir. , Üssünde + 1 bit.

Tabii ki, gerçek bir kayan nokta sayısını (örn. 12.345) bir kayan nokta gösteriminde depolamaya çalışırsanız, tüm bahisler kapalıdır, bu nedenle programınızın sayının gerçekte, gerçek bir tamsayı gibi davranmak için mantis (yani eşitliği karşılaştırmak için).

Bundan daha fazla tamsayı hassasiyetine ihtiyacınız varsa, her zaman keyfi bir kütüphane kullanabilirsiniz .

Daha Fazla Okuma
Lua'daki bir sayının maksimum değeri nedir?


İkinci argümanlarına ne dersin, yani kayan nokta, modern CPU'larda tam sayı aritmetiğinden daha hızlı veya daha hızlıdır? Tamsayı aritmetik yapmak için kayan nokta sayıları kullanırken bile bana şüpheli geliyor.
Andres F.29

2
@AndresF. İki yerine tek bir sayısal tür kullanarak bir kadroyu kaldırmazsanız, ne kadar hızlı olduğunu görmüyorum.
Robert Harvey

Kabul. Bana bir anlam ifade etmiyor. Bağlamdan alınıp alınmadığını merak ediyorum ...
Andres F.

1
Yeterince büyük tamsayılar edemez bir kayan nokta nesnesinde tam saklanabilir. 64-bitin doubleyaklaşık 51 kadar mantis biti vardır; Yaklaşık 2 ** 51'den büyük tek tamsayılarda yuvarlama hataları olacaktır. 64 bitlik bir tamsayı, daha büyük tamsayı değerlerini tam olarak depolayabilir, çünkü bir üsse herhangi bir bit ayırmaz.
Keith Thompson

@ KeithThompson: "Mantis'te depolanmış" dediğimde cevabımda ima olduğunu düşündüm. Ancak açıklığa kavuşturmak için cevabı düzenleyeceğim.
Robert Harvey

6

Çiftler mantis ve üs olarak saklanır. Daha fazla bilgi için formata bakın . Temel olarak, tüm sayılar şu şekildedir: mantis * 2 üs . 2 52'den küçük herhangi bir tamsayı için , üs sıfır olacaktır, bu da mantis biti bit için 52-bit işaretsiz tam sayıya eşdeğerdir. Negatif sayıları belirtmek için ayrı bir işaret biti kullanılır.

Aslında, 52'den büyük bazı tamsayılar bile 52'nin sonundaki rakamlar sıfır olduğu sürece tam olarak temsil edilebilir . Ayrıca, 0.5 gibi bazı kesirler tam olarak temsil edilebilir. Sadece fraksiyon taban 2'de sürekli olarak tekrarlandığında (1/3 gibi) veya aksi takdirde hassasiyeti kaybettiğiniz sayı tabanı noktasını aşan çok fazla bit gerektirdiğinde.


Sürekli olarak ondalık sayılardan kaynaklanmıyor. Çünkü birçok ondalık (temel on) sayı tam olarak ikisinin gücü olarak gösterilemez.
Robert Harvey

3
Taban 2'de, tam olarak temsil edilemez numaraları olur , sürekli tekrar olabilir. Örneğin, 0.1 ondalık sayı ikilikte 0,0 (0011) olur ve 0011 sürekli olarak tekrarlanır.
Karl Bielefeldt

3
Evet kesinlikle. Ama tabanda 10 tekrarlamıyor. Tabanda 2 tekrarlanıyor.
Robert Harvey
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.