私はCに比較的慣れていないということもできますが、質問について明確にする必要があります。数値を表すchar[]があります。このchar[]がLONG_MAXよりも長い場合は、長すぎることをユーザーに伝えたいと思います。問題は、その値をfloatと比較すると、切り捨てられることです。これが私の言いたいことです。
int main(int argc, char ** argv) {
char str[] = argv[1]; /* I set it to 9223372036854775809, only +1 higher than LONG_MAX */
double l = atof(str);
double j = LONG_MAX;
printf("%lf\n", l); /* This prints 9223372036854775808.000000, which is LONG_MAX ??? WHY?? */
printf("%lf\n", j); /* This prints same as above, 9223372036854775808.000000 */
printf("%s\n", l > j ? "true" : "false"); /* false */
return 0; /* what am I doing wrong? */
}
アップデート:
私はあなたのiretソリューションを試しましたが、それでも同じ丸めの問題が発生します
j = LONG_MAX;
int iret = sscanf (str, "%lf", &l);
if (iret != 1)
return 0; /* conversion was bad */
else {
if (l > j || l < -(j))
return 0; /* too small or too large */
}
printf("%lf\n", l);
printf("%lf\n", j);
printf("%s\n", l > j ? "true" : "false");