Sabit boyutlu kayan nokta türleri


92

İçinde stdint.h(C99), boost / cstdint.hpp ve cstdint(C ++ 0 x) vardır başlıklar, diğerleri arasında, tip int32_t.

Benzer sabit boyutlu kayan nokta türleri var mı? Gibi bir şey float32_t?


4
Neden böyle bir şeye ihtiyacın var?
AraK

41
Kayan nokta değerine sahip bir veri yapınız olduğunda ve bunun boyutunun tam olarak ne olduğunu bilmek istediğinizde buna benzer bir şeye ihtiyacınız vardır.
mafya

5
@mobrule: Sadece boyutun ne olduğunu bilmeniz gerekiyorsa, sizeofoperatörü kullanırsınız . Bunun gibi bir tür, bir algoritmanın bilinen belirli bir boyut olmasını gerektirdiğinde yararlı olacaktır.
Stephen Canon

6
@Stephen Canon - evet, boyutun ne olduğunu garanti etmek istediğiniz zamanlar için. Veri yapınızın bir örneğinin 64 bite sığacağını ve değer bazında bazı harici kitaplığa geçirilebileceğini varsayalım.
mafya

7
@StephenCanon Çapraz platform serileştirme kitaplığı düşünün. sizeofSürekli olarak sıraya dizilen ve sıralı olmayan yüzen tipler sorununu çözmek için nasıl kullanılabilir?
Kyle Strand

Yanıtlar:


48

Şu anda C veya C ++ standartlarında böyle bir şey yoktur. Aslında, floatikili kayan nokta formatı olacağına dair bir garanti bile yoktur .

Bazı derleyiciler, floattürün IEEE-754 32 bit ikili format olacağını garanti eder . Bazıları yok. Gerçekte, çoğu gömülü olmayan platformda floatIEEE-754 singletürü olsa da, ifadeleri daha geniş bir formatta değerlendiren bazı derleyiciler hakkındaki olağan uyarılar geçerlidir.

IEEE-754'ün 2008 revizyonu için C dili bağlamaları eklemeyi tartışan ve böyle bir typedef'in eklenmesini önerebilecek bir çalışma grubu var. Bu C'ye eklendiyse, C ++ standardının eninde sonunda ... uyacağını umuyorum.


3
IEEE-754 ne olursa olsun ya da olmasın, yine de endian taşınabilirlik sorunlarını önlemeyecektir.
Mark B

1
@Pietro: Dili değiştirmek, donanım uyumluluğunuzu etkilemez, yalnızca bazı donanımların uyumluluğunu engeller. Bir IEEE FP taşınabilirliği nasıl garanti eder?
Potatoswatter

1
@Potatoswatter: Donanım satıcılarını uyumlu çözümler sunmaya teşvik eder. Bölüm a, soft-float kitaplık kesmelerine ihtiyaç duymadan standart C'yi destekliyorsa ve bölüm b desteklemiyorsa, bu, parça a için bir pazar avantajıdır.
Stephen Canon

2
@Potatoswatter: (Neredeyse) donanımın hızı kimsenin umurunda değil. Donanım üzerinde çalışan yazılımın hızını önemsiyoruz. Üzerinde çalıştığı donanım standartlara uygunsa ve yazılımın hangi platformda çalıştığına bağlı olarak 15 farklı özel durumu algılaması ve düzeltmesi gerekmiyorsa yazılım daha hızlı olabilir.
Stephen Canon

8
Kodunuzun bir dizi niş mimaride derlenmesini önleyerek Dünya'da nasıl daha iyi taşınabilirlik elde edersiniz ? Ya kayan değerlerin IEEE olduğuna güvenirsiniz, bu durumda kodunuz zaten her IEEE uyumlu uygulamada çalışır ve başka hiçbir şeyde çalışmaz ya da çalışmazsınız, bu durumda kodunuz daha geniş bir sistem yelpazesinde çalışır. C ++ ise garantili IEEE uyumu, sihirli daha taşınabilir almak değildir kodunuzu, sadece o ki ekarte ediyorum hiç bu uyumsuz mimarileri üzerinde çalışır. Mantığınız tamamen geriye doğru.
jalf

30

floatIEEE 32 bit türünüzün olup olmadığını öğrenmek istiyorsanız kontrol edin std::numeric_limits<float>::is_iec559. Bu bir derleme zamanı sabiti, bir fonksiyon değil.

Daha kurşun geçirmez olmak istiyorsanız std::numeric_limits<float>::digits, IEEE standardı çift hassasiyeti gizlice kullanmadıklarından emin olun float. 24 olmalı.

Söz konusu olduğunda long double, digitsmakul olarak olabilecek birkaç IEEE formatı olduğundan kontrol etmek daha önemlidir : 128 bit (rakam = 113) veya 80 bit (rakam = 64).

Böyle olması pratik olmaz float32_tçünkü eğer varsa, genellikle kayan nokta donanımı kullanmak ve bir yazılım uygulamasına geri dönmek istemezsiniz.


long doubleOS X (hem 32 bit hem de 64 bit Intel) üzerine biçimi tam olarak küçük endian sırayla saklanan IEEE-754 çift genişletilmiş biçimidir. Hiç de korkak bir şey yok. 0-7 baytları anlam alanını ve 8 ve 9 baytları üs ve işaret alanlarını tutar.
Stephen Canon

@Stephen: bu iyi haber: v). Bu, gönderdiğim numaralara uyuyor mu?
Potatoswatter

1
Unutmayın ki çift genişletilmiş (diğer 754 formatlarından farklı olarak) açık bir ön anlamlı ve biti vardır, dolayısıyla 5.0Lbir anlamlılığı vardır a000000000000000. Tarafsız üssü +2'dir ve çift genişletilmiş üs eğilimi ise 3fff5.0L için yanlı üsdür 4001. Little-endian düzeninde depolandığında gerçek bayt kalıbı şudur 00 00 00 00 00 00 00 a0 01 40ve eğer bunu iki küçük endian 64-bit tam sayı olarak görürseniz, tam olarak ne gözlemlediğinizi görürsünüz.
Stephen Canon

(*) donanımda Intel tarafından uygulandığı şekliyle iki kat genişletilmiş. Çift genişletilmiş format aslında IEEE-754'ün (1985) diğer iki temel formatının olduğu gibi sabitlenmemiştir.
Stephen Canon

@Stephen: 4001Little- endian'da 01 40 00 00 ...başka bir şey yoksa, en az önemli olan bayt önce gelir. Dizinin a0 01 40sayı içinde bir yerde görünmesini bekliyorum (sadece bir rotasyon gerçekleştirmişlerse), ancak nedenini açıklamadığınızı a0ve 01 40tamamen ayrı yarılar olduğunu sanmıyorum .
Potatoswatter

18

Float32_t ve float64_t gibi typedef'lerin herhangi bir nedenle pratik olmadığını düşünüyorsanız, küçük yuvanızın dışına da bakamayacağınız için tanıdık işletim sisteminize, derleyiciye fazla alışmış olmalısınız.

32-bit IEEE kayan nokta işlemlerini ve 64-bit yapan diğerlerini yerel olarak çalıştıran donanım vardır. Bazen bu tür sistemler birbirleriyle konuşmak zorunda bile kalırlar, bu durumda her platformda bir çiftin 32 bit mi yoksa 64 bit mi olduğunu bilmek son derece önemlidir. 32 bitlik platform, diğerinin 64 bitlik değerlerine göre aşırı hesaplamalar yapacaksa, zamanlama ve hız gereksinimlerine bağlı olarak daha düşük hassasiyete çevirmek isteyebiliriz.

Benim platformumda tam olarak kaç bit olduğunu bilmediğim sürece, yüzer ve çiftler kullanmaktan kendimi rahatsız hissediyorum. Daha da fazlası, bunları bazı iletişim kanalları üzerinden başka bir platforma aktaracak olursam.


"Platformumda tam olarak kaç bit olduklarını bilmediğim sürece, yüzer ve çiftler kullanmaktan kişisel olarak rahatsız oluyorum. Hatta bunları bir iletişim kanalı üzerinden başka bir platforma aktaracaksam daha da fazla." - Metin dosyası formatlarını mı kullandığınızı mı söylüyorsunuz? Bunlarla dosya boyutunun dezavantajı vardır: 32 kayan nokta 4 bayta ihtiyaç duyar; metin biçimindeki bunlar yalnızca dört basamaklı bir sayıyı temsil edebilir ...
Pietro

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.