-8

C++ で数字を使用してこの問題が発生しています。

与えられた 2 つの数値:

numb1 = 0.000171438
numb2 = 11666;

私が行った場合

fillweight= float(numb1 * numb2)

答えとして「1」が得られますが、好きなようにすると

fillweight = 0.000171438 * 11666

画面に「1.9999」という回答が正しく表示されます - フロートを渡す際の問題は何ですか? 私は次のようなものでも試しました

fillweight = float(float(numb1) * float(numb2))

しかし、彼らはいつも同じ答えです。

4

3 に答える 3

2

fillweight = 0.000171438 * 11666

最初の数値はdouble定数であり、乗算は倍精度演算を使用して行われます(11666はに変換されますdouble)。これは、コンパイル時に発生する可能性があります。

fillweight = 0.000171438f * 11666f

と同じになります

fillweight = float(float(numb1) * float(numb2))

numb1とnumb2がfloatsの場合。

これはあなたの問題を解決しませんが。しかし、最小限の実用的な例がなければ、あなたのタイプに気をつける以外に言うことは何もありません。

于 2013-01-21T21:22:30.770 に答える
0

フロートの精度はダブルよりも大幅に低くなります。「機能する」ものでは、リテラルはダブルとして解釈されます。

それに関する多くの情報はここで見つけることができます:

浮動小数点と倍精度

フロートが何を保持できるかを簡単に確認すると、この違いが問題の原因ではない可能性があります。int問題は、結果を保持しようとしている変数が、実行されている乗算に対しておそらくまたは他の不適切なタイプであるということだと思います。

于 2013-01-21T21:23:44.530 に答える
0

出力メソッドで丸めが発生している可能性があります。たとえば、次のコードを見てください。

#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout.precision(5);
    std::cout << "Precision(5)" << std::endl;
    {
    float numb1 = 0.000171438;
    float numb2 = 11666;
    float fillweight = float(numb1 * numb2);
    std::cout << "Test #1: fillweight = " << fillweight << " numb1 = " << numb1 << " numb2 = " << numb2 << std::endl;
    }
    {
    float numb1 = 0.000171438;
    float numb2 = 9999;
    float fillweight = float(numb1 * numb2);
    std::cout << "Test #2: fillweight = " << fillweight << " numb1 = " << numb1 << " numb2 = " << numb2 << std::endl;
    }
    std::cout.precision(10);
    std::cout << "Precision(10)" << std::endl;
    {
    float numb1 = 0.000171438;
    float numb2 = 11666;
    float fillweight = float(numb1 * numb2);
    std::cout << "Test #3: fillweight = " << fillweight << " numb1 = " << numb1 << " numb2 = " << numb2 << std::endl;
    }
    {
    float numb1 = 0.000171438;
    float numb2 = 9999;
    float fillweight = float(numb1 * numb2);
    std::cout << "Test #4: fillweight = " << fillweight << " numb1 = " << numb1 << " numb2 = " << numb2 << std::endl;
    }

    int i;
    std::cin >> i;
    return 0;
}

そして、次の出力が得られます。

Precision(5)
Test #1: fillweight = 2 numb1 = 0.00017144 numb2 = 11666
Test #2: fillweight = 1.7142 numb1 = 0.00017144 numb2 = 9999
Precision(10)
Test #3: fillweight = 1.999995708 numb1 = 0.0001714380051 numb2 = 11666
Test #4: fillweight = 1.714208603 numb1 = 0.0001714380051 numb2 = 9999
于 2013-01-21T22:09:18.667 に答える