1

浮動小数点数を次のように定義float transparency = 0.85f;し、次の行でそれを関数に渡します -- fcn_name(transparency)-- しかし、変数transparencyには値0.850000002があり、デフォルト設定で出力すると、それは0.850000002です。値については、0.65fです0.649999998

この問題を回避するにはどうすればよいですか? 浮動小数点が単なる近似であることはわかっていますが、少数の小数で浮動小数点を定義した場合、それが変更されていないことをどのように確認できますか?

4

2 に答える 2

3

バイナリ形式で表される浮動小数点値には、特定の10 進精度はありません。数値が一定量の10 進数を表すことができるという仕様を読んだからといって、実際にはあまり意味がありません。これは、物理的な (そして意味のある) 2 進精度を、あまり意味のない 10 進近似に大まかに変換しただけです。

2 進浮動小数点形式の 1 つの特性は、2 のべき乗の有限和 (2 の負のべき乗を含む) として表現できる数値のみを正確に (その仮数幅の制限内で) 表現できることです。0.5, 0.25, (10 進数) のような数値は、2 の累乗 ( , ) またはその合計である0.75ため、2 進浮動小数点形式で正確に表されます。2^-12^-2

一方、10 進数などの数は0.1、2 の累乗の有限和では表現できません。0.1浮動小数点 2 進数での 10 進数の表現の長さは無限です。0.1これは、 を有限バイナリ浮動小数点形式で正確に表すことができないことを直ちに意味します。0.110 進数が 1 桁しかないことに注意してください。ただし、この数はまだ表現できません。これは、浮動小数点の精度を 10 進数で表現することはあまり役に立たないという事実を示しています。

0.85あなたの例のような値0.65も表現できません。そのため、有限バイナリ浮動小数点形式への変換後にこれらの値が歪んでいるのがわかります。実際、日常生活で遭遇するほとんどの小数 10 進数は、これらの浮動小数点型がどれほど大きいかに関係なく、2 進浮動小数点型では正確に表現できないという事実に慣れる必要があります。

于 2012-10-23T22:02:41.037 に答える
0

この問題を解決するために私が考えることができる唯一の方法は、特性と仮数を別々に関数に渡し、ITに値の適切な設定を行わせることです。

また、より高い精度が必要な場合は、

http://www.drdobbs.com/cpp/fixed-point-arithmetic-types-for-c/184401992は私が知っている記事です。これはC++でのみ機能しますが。(同等のC実装を検索しています)。

私はVS2010でこれを試しました、

#include <stdio.h>
void printfloat(float f)
{
    printf("%f",f);
}

int main(int argc, char *argv[])
{
    float f = 0.24f;
    printfloat(f);
    return 0;
}

OUTPUT: 0.240000
于 2012-10-23T21:36:54.047 に答える