將在 Python 中創建的 csv 檔案中的浮點數匯入到用 C 撰寫的程式時,我遇到了一些精度問題。以下代碼是我的程式中發生的情況的示例:Python 將 float32 值寫入檔案(在本例中為 9.8431373 e 00),我把它讀成一個字串并用strtof它把它轉換回float32,但結果在最后一個小數位上是不同的。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char* a;
char x[10] = "9.8431373";
printf("%s\n", x);
float f = strtof(x,&a);
printf("%.7e\n", f);
}
輸出:
9.8431373
9.8431377e 00
現在,如果我錯了,請糾正我,但是floatC 中的物件有 32 位,在浮點數所在的任何位置后都會導致小數點后 7 位的精度。因此,如果我沒有宣告一個大于浮點數允許的數字,就不應該有任何精度錯誤。
如果我確實宣告了一個比 C 中的浮點數更精確的數字,那么 Python 是如何接受“9.8431373e 00”作為 Float32 而沒有更正它的?Python 和 C 對 32 位浮點數有不同的標準嗎?
uj5u.com熱心網友回復:
Python 默認解釋為 double。如果您打包為單精度并再次解包,您會在 Python 中看到相同的問題:
>>> import struct
>>> a = struct.pack('<f', 9.8431373)
>>> b, = struct.unpack('<f', a)
>>> b
9.843137741088867
uj5u.com熱心網友回復:
從根本上說,十進制小數 9.8431373 不存在于二進制浮點數中,無論是單 ( float) 還是雙精度。作為 32 位float,您可以獲得的最接近的是一個二進制數,相當于大約 9.84313774,而作為double最接近的,您可以獲得的是一個與大約 9.8431373000000004 相對應的數字。
這些數字如何以十進制顯示給您,取決于您和您的編程語言的某種組合。有時它們是圓形的,有時它們被截斷。我對 Python 了解不多,但我知道它的規則與 C 的規則至少有一點不同,所以我對你看到最后一位數字相差 1 并不感到驚訝。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327480.html
上一篇:為什么用memcpy和sprintf復制特定的緩沖區大小,在新緩沖區中列印的字符比原始緩沖區中的多?
下一篇:我應該向這個函式發送什么引數
