strtod如何转换我的论点?

时间:2016-06-19 17:10:59

标签: c floating-point

我有一个有趣的程序,我想提出一个参数,以便它会触发执行sh实用程序的最后一个条件。

#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);
}

我能做到这一点的一种方法是将NAN作为参数。但是,我不明白为什么将3.141593作为参数不会转换为与“answer”变量相同的值。

有人写了一篇关于它的博文,解释如下: http://blog.pkt5.com/2012/09/iosmashthestack-level02alt.html

“这是因为strtod的转换将我们输入的3.141593转换为3.14159298,一个双倍。因此它总是太低了”

为什么将3.141593转换为3.14159298?

1 个答案:

答案 0 :(得分:0)

此处的问题是float无法代表double可以代表的所有值。考虑这个例子:

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

c等于a?答案是否定的,因为中间步骤中的精度有所下降,其中值被截断以适合float