2016-06-19 8 views
0

私は面白いプログラムを手に入れました。shユーティリティを実行する最後のelse条件を引き起こすように引数を与えたいと思います。strtodは私の引数をどのように変換しますか?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 


#define answer 3.141593 

void main(int argc, char **argv) { 

    float a = (argc - 2)?: strtod(argv[1], 0); 

    printf("You provided the number %f which is too ", a); 

    if(a < answer) 
       puts("low"); 
    else if(a > answer) 
       puts("high"); 
    else 
       execl("/bin/sh", "sh", "-p", NULL); 
} 

私がこれを行う方法の1つは、NANを引数として与えることです。しかし、私は3.141593を引数として与えても "答え"変数と同じ値に変換されないのはなぜか分かりません。

いくつかの一つは、それについてのブログ投稿を書き、説明は以下の通りです: http://blog.pkt5.com/2012/09/iosmashthestack-level02alt.html

「これは、私たちが3.14159298に入る3.141593、ダブルを変換しますは、strtodによる変換であるしたがって、それは常になります。低すぎる "

なぜ3.141593を3.14159298に変換するのですか?

+0

それはしません:http://ideone.com/GrlEcS –

+1

@OliverCharlesworth:askerはあなたの理想リンクと違って、strtod結果が浮動小数点に割り当てられています。 http://ideone.com/D4Mw1i – AlexPogue

+0

を参照してください。データは、限られた精度で有限数のビットを使用して格納されます。あなたの質問は、データ型のビット数を使って表現できる数字に変わりはありません。 たとえば、[this IEEE standard](http://steve.hollasch.net/cgindex/coding/ieeefloat.html)によると、単精度浮動小数点は32ビットで表されます。明らかに、これらの32の「1と0」はすべての実数を表すことはできません。浮動小数点数は、特定の精度よりも大きな値を正確に表すことはできません。 – AlexPogue

答えて

0

floatは、doubleが表すことができるすべての値を表すことはできません。この例を考えてみましょう:

double a = 3.141593; 
float b = a; 
double c = b; 

aに等しいcのですか?中間ステップで精度が失われたため、答えは「いいえ」です。この値は、floatに収まるように切り捨てられています。

関連する問題