簡體   English   中英

將UINT64轉換為浮動?

[英]Casting UINT64 to float?

將UINT64轉換為浮點數是否安全? 我意識到UINT64不包含小數,所以我的浮點數將是整數。 但是,我返回delta-time的函數返回一個UINT64,這對我目前正在使用的函數來說不是一個非常有用的類型。 我假設一個簡單的static_cast <float>(uint64value)不起作用?

定義安全 - 如果64位值很大,您很容易丟失很多精度數字,但除此之外(可能是您不介意的已知問題),轉換應該是安全的。 如果您的編譯器沒有正確處理它,請獲得更好的編譯器。

如果將UINT64(8字節值)轉換為浮點數(只有4個字節),則可能會截斷它們的大值。

您可以先嘗試使用long doubledouble執行算術:

typedef long double real_type
real_type x = static_cast<real_type>(long1);
real_type y = static_cast<real_type>(long2);

real_type z = x / y;
float result = static_cast<float>(real_type);

經驗法則:int可以從double轉換為back

從浮動投射到反彈是安全的,但是你將被限制在相當小的數字,大約1600萬,如果超過允許的幅度,你將默默地失去低階精度。 使用double,您可以使用更大的整數。

假設有一個IEEE 754底層浮點系統,您將能夠精確地將23位的整數與浮點數和52位的 整數進行精確轉換。 實際上,由於隱藏位,你得到一個位,所以你可以在一個double中擬合一個整數,包括1FFFFFFFFFFFFF或9007199254740991。

所以每個32位整數都有一個精確的double表示; 它可以安全地轉換回來,對它們的普通算術運算將產生精確的結果。

實際上,這就是JavaScript為每個整數運算所做的事情。 那些說“浮點不准確”的人大肆過分簡化。

安全? 安全是什么意思? 就精度而言,IEEE-754 float具有23 - (+ 1)位尾數。 通過將64位值強制轉換為“舍入”24位值,您將在廣泛的最低有效位中造成大量精度損失。 您的申請中是否可以接受此損失? 坦率地說,如果你的原始值真正使用了64位范圍,那么強制它變成像float一樣小的東西對我來說聽起來不是一個好主意。

為什么static_cast不工作​​?

Max uint64 is 2^64 = 1.84467441 × 10^19

根據這個最大的32位浮點數

9.999999×10^96.

應該工作......有問題嗎?

http://en.wikipedia.org/wiki/Decimal32_floating-point_format

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM