2011-12-14 7 views
1
#include "stdafx.h" 
#include "stdio.h" 
#include "math.h" 

int main() 
{ 
float c; 

printf("Type c"); 

scanf("%f", &c); 


    printf("C is c: %f ",c); 

    while(getchar()!='\n'); 
    getchar(); 
    return 0; 

    } 

非常に単純なコード、私はほとんどの数字でC. で起動OK動作しますが、例えばもしI入力47.2それは88.4321出力88.432098 で私47.200001を出力しますが、5.4作品のような他の数字とOK 5.400000 私はMicrosoft Visual Studio 10を使用します。scanf float、print float、別の値?

フロートを置く代わりに上記のコードを使用すると、もう一つは私はダブルを入れます私はprintfできません%fの代わりに何を置くべきですか? しかし、それは私の最初の質問をもっと心配しているかもしれません。多分、私はC++としてCコードをコンパイルしているかもしれません。

+1

%lfはdoubleを出力します –

+0

'%lf'と' double' ftw – Nakilon

+1

@MichaelHaidl:標準によると、 '%f'と'%lf'は 'printf()'に渡されたときと同じ振る舞いをします。 'scanf()'とだけ違っています。 –

答えて

0

数値精度について。これは、浮動小数点値をバイナリ形式で格納するときの既知の問題です。 PHPドキュメントから少し修正されました...

浮動小数点数の精度は限られています。システムに依存しますが、ほとんどの言語では通常、IEEE 754倍精度形式が使用されます。これは、1.11e-16のオーダーの丸めによる最大相対誤差を与えます。基本的でない算術演算は、より大きな誤差を与える可能性があり、もちろん、いくつかの演算が複合化された場合にはエラーの進行を考慮する必要があります。

さらに、基数10の浮動小数点数(0.1または0.7など)で正確に表現できる有理数は、基数2の浮動小数点数として正確には表現されません。仮数。したがって、それらは内部精度のわずかな損失なしに内部バイナリの対応物に変換することはできません。内部表現が7.99999999999991118 ...

のようになるため、floor((0.1 + 0.7)* 10)は通常予想される8の代わりに7を返します。浮動小数点の結果が最後の桁になり、浮動小数点数が等しいかどうかは決して比較されません。

高精度が必要な場合は、非常に正確な数値を扱うことを目的とする補助ライブラリを調べる必要があります。

+0

英語が私の主要な言語だったなら、私は直感的に "float"という言葉の意味を考えていたと思います。どういうわけか私は固定小数点演算http://en.wikipedia.org/wiki/Fixed-point_arithmeticをやると思いました。ありがとう、アヒルマン – user1094566

+0

私は間違っている場合は私を修正しますが、これに対してより正確な倍数(または特定の言語の小数)ではありませんか? –

+0

言語に応じて、はい、正しいMarnixです。 – ahillman3