我必须找到函数f(x) = x / (1-x)^2
的结果,其中0 < x < 1
。
该值必须格式化为最多6
个小数位。
这是我的C ++代码:
float x; scanf("%f",&x);
printf("%.6f",x/((1-x)*(1-x)));
我在Python中做了同样的事情:
x = float(input())
print ("%.6f" % (x/((1-x)**2)))
对于x的某些值,两个程序都会给出不同的答案。
例如,对于x = 0.84567
,
C ++提供35.505867
,Python提供35.505874
为什么会这样? 根据解决方案,Python的答案是正确的,而C ++的答案是错误的。
答案 0 :(得分:4)
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <iomanip>
int main()
{
const char data[] = "0.84567";
float x;
sscanf(data, "%f",&x);
double x2;
sscanf(data, "%lf",&x2);
std::cout << std::setprecision(8) << (x/((1-x)*(1-x))) << std::endl;
std::cout << std::setprecision(8) << (x2/((1-x2)*(1-x2))) << std::endl;
}
示例输出:
35.505867
35.505874
结论:
Python正在使用双打,你正在使用浮点数。
答案 1 :(得分:3)
Python已实现IEEE 754双精度,因此其输出更接近真实答案。
来自文档:https://docs.python.org/3/tutorial/floatingpoint.html#representation-error
今天(2000年11月)几乎所有机器都使用IEEE-754浮点数 算术,几乎所有平台都将Python浮点数映射到IEEE-754 “双精度”。
在C ++中,float是单精度的。使用double
代替float
可以为您提供类似的输出。
答案 2 :(得分:3)
正如其他人所指出的,python中的浮点数是使用C中的double
类型实现的。请参阅Python文档的section 5.4。
在Coliru上运行此示例:
#include <cmath>
#include <cstdio>
int main()
{
float pf = 0.84567f;
printf("%.6f\n",pf/((1-pf)*(1-pf)));
double pd = 0.84567;
printf("%.6f\n",pd/((1-pd)*(1-pd)));
return 0;
}
证明了区别:
35.505867
35.505874