[英]Does printf() modify its parameters?
我試圖了解不同的語言如何處理浮點數。 我知道浮點表示存在一些固有的問題,這就是為什么如果你在 Python 中做 0.3 + 0.6,你會得到 0.899999 而不是 0.9
然而,這些代碼片段讓我震驚:
double x = 0.1,
sum = 0;
for(int i=0; i<10; ++i)
sum += x;
printf("%.9lf\n",sum);
assert(sum == 1.0);
上面的代碼片段工作正常。 它打印 1.0。 但是,由於斷言失敗,以下代碼段給出了運行時錯誤:
double x = 0.1,
sum = 0;
for(int i=0; i<10; ++i)
sum += x;
assert(sum == 1.0);
printf("%.9lf\n",sum);
上面兩個片段中唯一的變化是 assert 和 printf 語句的順序。 這讓我認為 printf 正在以某種方式修改其參數並以某種方式將它們四舍五入。
有人可以對此有所了解嗎?
某些處理器,例如 x86,具有比數據類型精度更高的浮點寄存器(80 位,而雙精度則為 64 位)。 調用 printf() 會使這些寄存器存儲在堆棧中,其中只有 64 位分配給變量。 這會導致您觀察到的差異。
有關更多信息,請參閱 每個計算機科學家應該了解的有關浮點運算的知識。
printf()
不修改其參數。
我無法想象向錯誤尋求幫助而不是說明您遇到了什么錯誤。 你的意思是它斷言。 您確定兩者都沒有斷言,但出於某種原因,您只能看到在printf()
之前斷言的那個嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.