浮点常数

时间:2016-07-04 06:46:04

标签: c floating-point

以下代码:

$('#datetimepicker5').datetimepicker({defaultDate: "11/1/2013"});

我得到的输出是:

  

0.7000000000 0.6999999881

请解释为什么#include<stdio.h> int main() { float a = 0.7; printf("%.10f %.10f\n", 0.7f, a); return 0; } 打印为a,而文字常量打印为0.6999999881

在这种情况下,浮点的使用是否恒定编译器依赖?

2 个答案:

答案 0 :(得分:4)

如果编译器将printf("%.10f",0.7f)定义为1或2,则为FLT_EVAL_METHOD打印的字符串获取“0.7000000000”是正常行为。

实际上,在该模式下,浮点常量可以以其类型的精度beyond表示(C11 5.2.4.2.2:9):

  

除了赋值和强制转换(删除所有额外的范围和精度)之外,具有浮动操作数的运算符产生的值以及通常的算术转换和浮动常量的值将被计算为格式其范围和精度可能大于该类型所要求的范围。

换句话说,为下面的修改程序打印0.7000000000 0.6999999881 FLT_EVAL_METHOD=2 is one possible behavior

#include<stdio.h>
#include <float.h>

int main()
{
    float a=0.7;
    printf("%.10f %.10f FLT_EVAL_METHOD=%d\n",0.7f, a, (int)FLT_EVAL_METHOD);
    return 0;
}

因为编译器将FLT_EVAL_METHOD定义为2,所以printf("%.10f %.10f", 0.7f, 0.7)被视为printf("%.10f %.10f", (double)0.7L, (double)0.7L)。同样,printf("%.60Lf %.60Lf\n", (long double)0.7f, (long double)0.7)相当于printf("%.60Lf %.60Lf\n", 0.7L, 0.7L)

答案 1 :(得分:0)

您获得不同值的原因是,当您将printf(3)(这是一个vararg函数)作为未经检查的参数传递时,编译器 一个强制转换为{{1 (和我猜测的优化)将(double)文字转换为0.7f ,然后再将其传递给0.7D ,这样您实际上就是在传递 printf的两个不同值,第一个是printf,第二个是变量(double)0.7f的存储值,转换为a