簡體   English   中英

Matlab 與 C++ 雙精度

[英]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.

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