[英]Casting from int64_t to double to int64_t again changes it's value
int main()
{
int64_t iaVal = (int64_t)9007199258935295;
double daVal = (double)iaVal;
std::cout << "original " << iaVal << "\tAfter conversion " << (std::int64_t)daVal << std::endl;
}
輸出 :
Original 9007199258935295
After conversion 9007199258935296
如何從 double 中獲得正確的值?
從雙精度浮點格式:IEEE 754 雙精度二進制浮點格式:binary64 [強調我的]:
雙精度二進制浮點數是 PC 上常用的格式,因為它比單精度浮點數范圍更廣,盡管它的性能和帶寬成本更高。 它通常被簡單地稱為雙倍。 IEEE 754 標准將 binary64 指定為具有:
- 符號位:1位
- 指數:11 位
- 有效位精度: 53 位(52 位顯式存儲)
符合 IEEE 754 標准的雙精度二進制浮點數的有效位精度為 53 位,而 64 位的有符號整數 ( int64_t
) 自然具有 64 位的精度,這意味着前者將無法表示后者。 此外,C++ 中的浮點甚至不能保證符合 IEE 754(實現定義),但對於它們的實現
#include <limits>
static_assert(std::numeric_limits<double>::is_iec559, "");
根據上面的重要參數, double
將能夠表示 32 位整數的所有數字。
如何從 double 獲得正確的值?
你不能。 當您將其轉換為無法精確表示的類型時,該值已丟失。 考慮類似的情況:我已將int
值 42 轉換為bool
值true
。 當我將其轉換回整數時,它會將其值更改為 1。如何轉換為正確的值? (我不能)
您有以下選擇:
double
值。 9007199258935295 不能表示為 64 位二進制浮點 (IEEE-754) 1 。 所有 32 位整數都是可表示的。long double
代替。 x86 80 位擴展浮點和 128 位 IEEE-754 浮點都可以表示所有 64 位整數。1盡管 IEE-754 標准無處不在,但從技術上講,無浮點類型的精度是由 C++ 語言定義的。 它由語言實現定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.