簡體   English   中英

從 int64_t 轉換為 double 到 int64_t 再次改變它的值

[英]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 轉換為booltrue 當我將其轉換回整數時,它會將其值更改為 1。如何轉換為正確的值? (我不能)

您有以下選擇:

  • 僅使用可表示為double值。 9007199258935295 不能表示為 64 位二進制浮點 (IEEE-754) 1 所有 32 位整數都是可表示的。
  • 使用long double代替。 x86 80 位擴展浮點和 128 位 IEEE-754 浮點都可以表示所有 64 位整數。
  • 使用任意精度算術代替有限精度,在這種情況下,您無需擔心精度不足。 C++ 標准庫不提供任意精度算術的實現。

1盡管 IEE-754 標准無處不在,但從技術上講,無浮點類型的精度是由 C++ 語言定義的。 它由語言實現定義。

暫無
暫無

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

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