[英]Matlab vs C++ Double Precision
我正在將一些代碼從 Matlab 移植到 C++。
在 Matlab 中
format long
D = 0.689655172413793 (this is 1.0 / 1.45)
E = 2600 / D
// I get E = 3.770000000000e+03
在 C++ 中
double D = 0.68965517241379315; //(this is 1.0 / 1.45)
double E = 2600 / D;
//I get E = 3769.9999999999995
這對我來說是個問題,因為在這兩種情況下我都必須四舍五入到 0(Matlab 的修復),在第一種情況下(Matlab)變成 3770,而在第二種情況下(C++)變成 3769。
我意識到這是因為 C++ 案例中另外兩個最低有效數字“15”。 鑒於 Matlab 似乎只能以雙精度存儲多達 15 個有效數字的精度(如上所示 - 0.689655172413793),我如何有效地告訴 C++ 忽略后面的“15”?
所有計算均以雙精度完成。
您對 C++ 和 MATLAB 打印雙精度值的不同方式感到困惑。 MATLAB 的format long
僅打印 15 個有效數字,而 C++ 打印 17 個有效數字。 在內部兩者都使用相同的數字: IEEE 754 64 位浮點數。 為了在 MATLAB 中重現 C++ 行為,我定義了一個匿名函數disp17
,它打印具有 17 個有效數字的數字:
>> disp17=@(x)(disp(num2str(x,17)))
disp17 =
@(x)(disp(num2str(x,17)))
>> 1.0 / 1.45
ans =
0.689655172413793
>> disp17(1.0 / 1.45)
0.68965517241379315
您會看到 MATLAB 和 C++ 中的結果是相同的,它們只是打印不同數量的數字。 如果您現在使用相同的常量繼續使用兩種編程語言,您會得到相同的結果。
>> D = 0.68965517241379315 %17 digits, enough to represent a double.
D =
0.689655172413793
>> ans = 2600 / D %Result looks wrong
ans =
3.770000000000000e+03
>> disp17(2600 / D) %But displaying 17 digits it is the same.
3769.9999999999995
打印 17 或 15 位數字的背景:
如果我了解您要實現的目標,使用ceil
函數可能會有所幫助:
ans = ceil(ans); /* smallest integral value that is not less than ans. */
// now ans in C++ is also be 3970.
這里是用法參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.