2017-03-15 3 views
-1

現在、C++を使用している場合、次の操作20 /(10.0/6)の結果が12(double)になるのはなぜかと思います。 10.0はdouble、20と6は整数です。 (10.0/6)の結果は1.66になります.6が最初にdoubleに変換されるからです。しかし、なぜ20/1.66、次に12、12.05ではないのですか?部門の型変換

サンプルプログラム:

#include <iostream> 
using namespace std; 
int main() 
{ 
    cout << "20/(10.0/6): " << (20/(10.0/6)) << endl; 
    return 0; 
} 

サンプル・セッション(GCC、cygwinの、Windowsの10から64ビット):

$ echo -e '#include <iostream> 
> using namespace std; 
> int main() 
> { 
> cout << "20/(10.0/6): " << (20/(10.0/6)) << endl; 
> return 0; 
> } 
> ' > test-div.cc 

$ g++ -o test-div test-div.cc 

$ ./test-div.exe 
20/(10.0/6): 12 
+2

結果を*チェック*しますか? 'int'変数に代入していますか? –

+6

'(10.0/6)'は実際には '1.6666666666666667'(ほとんどのシステムで)です。精度が高い場合、除算の結果は実際には '11.99999999999999976'で、' double'に格納されたときに '12.0'に丸められます。 –

+1

あなたの研究を実証するためのサンプルコードを投稿してください。なぜ結果は12だと思いますか? –

答えて

3

まず最初は12である、式の真の値である:

    20  20 * 6  120 
20/(10.0/6) = ------ = -------- = ------ = 12 
        10  10  10 
        ---- 
        6 

浮動小数点は第二のものは有限精度です。 Doubleには52ビットの仮数があり、これは16進数に近い16です。

10進数の10/6が1.6666666666666667に近い値になるようにします。しかし、内部的には2進数です.0.1.66666666666667406815349750104360282421112060547のように、10進数で直接バイナリを表すことができれば - それはできません。

上記の方程式は、12に近づくので、返される内容は2倍にもなります。