私は面白いプログラムを手に入れました。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に変換するのですか?
それはしません:http://ideone.com/GrlEcS –
@OliverCharlesworth:askerはあなたの理想リンクと違って、strtod結果が浮動小数点に割り当てられています。 http://ideone.com/D4Mw1i – AlexPogue
を参照してください。データは、限られた精度で有限数のビットを使用して格納されます。あなたの質問は、データ型のビット数を使って表現できる数字に変わりはありません。 たとえば、[this IEEE standard](http://steve.hollasch.net/cgindex/coding/ieeefloat.html)によると、単精度浮動小数点は32ビットで表されます。明らかに、これらの32の「1と0」はすべての実数を表すことはできません。浮動小数点数は、特定の精度よりも大きな値を正確に表すことはできません。 – AlexPogue