İç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
?
İç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
?
sizeof
operatörü kullanırsınız . Bunun gibi bir tür, bir algoritmanın bilinen belirli bir boyut olmasını gerektirdiğinde yararlı olacaktır.
sizeof
Sürekli olarak sıraya dizilen ve sıralı olmayan yüzen tipler sorununu çözmek için nasıl kullanılabilir?
Yanıtlar:
Şu anda C veya C ++ standartlarında böyle bir şey yoktur. Aslında, float
ikili kayan nokta formatı olacağına dair bir garanti bile yoktur .
Bazı derleyiciler, float
türün IEEE-754 32 bit ikili format olacağını garanti eder . Bazıları yok. Gerçekte, çoğu gömülü olmayan platformda float
IEEE-754 single
tü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.
float
IEEE 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
, digits
makul 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 double
OS 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.
5.0L
bir anlamlılığı vardır a000000000000000
. Tarafsız üssü +2'dir ve çift genişletilmiş üs eğilimi ise 3fff
5.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 40
ve 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.
4001
Little- endian'da 01 40 00 00 ...
başka bir şey yoksa, en az önemli olan bayt önce gelir. Dizinin a0 01 40
sayı içinde bir yerde görünmesini bekliyorum (sadece bir rotasyon gerçekleştirmişlerse), ancak nedenini açıklamadığınızı a0
ve 01 40
tamamen ayrı yarılar olduğunu sanmıyorum .
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.
Şu anda aşağıdaki türleri dile eklemek için bir teklif var:
decimal32
decimal64
decimal128
bir gün erişilebilir olabilir #include <decimal>
.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
decimal24
Ayrıca 24 bit örnekleri daha kolay olan wav dosyalarını okuma gibi şeyleri yapmak için de!