2017-09-29 5 views
4

std::nexttoward関数コールで次のコードが同じ番号を返すのはなぜですか?すべてのstd :: nexttoward関数呼び出しで同じ結果が得られる理由

#include <cmath> 
#include <iostream> 
#include <limits> 

int main() 
{ 
    std::cout.precision(std::numeric_limits<double>::max_digits10); 
    std::cout.setf(std::ios::fixed); 

    auto foo = 0.00000000000011134; 
    std::cout << foo << std::endl; 

    for (int i = 0; i < 100; ++i) 
    { 
     foo = std::nexttoward(foo, 1.0); 
     std::cout << foo << std::endl; 
    } 
} 

http://coliru.stacked-crooked.com/a/551b6e2b867b2f3b

フラグのいずれもhere(FE_OVERFLOW、FE_UNDERFLOWиFE_INEXACT)が設定されて述べられていません。

答えて

4

これは、浮動小数点形式は、一般的に特定の数のの数字に保持することを目的としているからです。数値的に小さい値とstd::ios::fixedフォーマットを使用

std::cout.setf(std::ios::fixed); 

は(小数点以下)の非有意「先頭の」ゼロの束を挿入するためにフォーマットされた出力を強制します。テストプログラムの出力に実際に表示されます。これは、固定されたprecision()の後にI/Oライブラリがすべてを切り詰める必要があるときに、実際の有効桁を切り捨てることを犠牲にして行われます。

、出力はあなたが期待するものとなっstd::ios::fixedの書式フラグを削除(およびprecision()を維持)(GCC 7.2.1、and reproduced on Coliruで自分自身をテストした)後:...

1.1134e-13 
1.1134000000000001e-13 
1.1134000000000002e-13 
1.1134000000000003e-13 
1.1134000000000005e-13 
1.1134000000000006e-13 
1.1134000000000007e-13 
1.1134000000000008e-13 
1.113400000000001e-13 
1.1134000000000011e-13 
1.1134000000000012e-13 

など

移動します小数点を左に13番目の位置(それはe-13と言います)、そしてstd::ios::fixedが指定された桁数の後にすべてを切り捨てた後に何が起こるかを見てください。

関連する問題