[英]precision loss while converting from python float to C++ double
[英]C++ converting string to float/double without loss of data
我正在尋找一個字符串轉換為浮點數而不會丟失數據的方法。 例如,如果我使用istringstream或:: atof(x.c_str()),則由於四舍五入而丟失了數據。
通常,這對我來說不是問題,但我使用的數據必須與讀取的數據相同。 這是一個數字及其轉換成的示例。
-8.000001 -> -8
-0.6257381 -> -0.625738
12.0 -> 12 (drops the .0)
如果有人可以幫助我,我將非常感激
謝謝馬特
您的問題中存在三個潛在問題:
顯示的精度值。 要控制使用的精度,請包含#include <iomanip>
並使用std::cout << std::setprecision(17);
設置要使用的位數。
格式化。 如果要用“ 12.0”代替“ 12.0”,則應注意,“。0”未存儲在float
或double
。 double
精度值僅包含值12; 它不包含有關原始精度或錯誤間隔的任何信息。 恰好是12,僅此而已。 如果要以特定方式對其進行格式化,則必須使用I / O流的格式標志,或者編寫自己的代碼來進行格式化。
准確性。 普通的float
和double
類型不能精確表示8.000001或0.6257381。 它們使用二進制表示浮點值,並且當十進制數字轉換為二進制時會出現一些錯誤。 如果您對浮點數的使用非常簡單,並且所使用的位數比float
和double
的限制少得多,那么您可以忽略這一點,而僅用有限的位數來格式化數字。 如果超出簡單的情況,則需要進行錯誤分析,這可能會非常復雜。
您將需要其他數據類型。
浮點十進制類型將使您可以完全按照所需的方式存儲數字。 在這種類型中,數字以成對的方式(尾數,指數)存儲,就像科學計數法和IEEE二進制浮點數一樣。
您的示例將存儲為
(-8000001, -6)
(-6257381, -7)
(120, -1)
例如,用於醫療設備通信的ISO 11073標准使用了這種格式。
缺點是算術會相當慢,因為所有浮點算術硬件都設計為使用以base-2為指數的數字。
根據經驗, float
只能精確到6位有效數字。 因此,如果您的字符串中包含更多數字,則會達到精度極限。
一個double
會給你,這並不奇怪,關於這雙精度; 即12位有效數字。
有關更多說明,請參見浮點類型的有效位數 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.