有人能给我解释一下为什么我会得到两个不同的答案吗

#include <stdio.h>  

int main()
{
    double Vmax = 2.9; 
    double Vmin = 1.4; 
    double step = 0.1; 

    double a =(Vmax-Vmin)/step;
    int b = (Vmax-Vmin)/step;
    int c = a;

    printf("%d  %d",b,c);  // 14 15, why?
    return 0;
}

我希望这两种情况都能得到15分,但似乎我错过了这门语言的一些基本知识.

我不确定这是否相关,但我是在CodeBlock中做测试的.但是,如果我在某个在线编译器(this one for example)中键入相同的代码行,我会得到两个打印变量的答案15.

推荐答案

...为什么我会得到两个不同的号码.

除了通常的浮点问题,bc的计算路径是以不同的方式到达的.c是通过首先将值保存为double a来计算的.

double a =(Vmax-Vmin)/step;
int b = (Vmax-Vmin)/step;
int c = a;

C允许使用更宽的类型计算中间浮点数学.判断<float.h>中的值FLT_EVAL_METHOD.

除了赋值和强制转换(删除所有额外的范围和精度)外,.

-1不确定;

方法的范围和精度计算所有运算和常量. 类型;

1判断float型和double型操作和常数

2将所有运算和常量求值到 long double型.

C11dr§5.2.4.2.2 9

作品reported 2

通过将商保存在double a = (Vmax-Vmin)/step;中,精度被强制为double,而int b = (Vmax-Vmin)/step;可以计算为long double.

这种细微的差异是由于(Vmax-Vmin)/step(可能计算为long double)被保存为double,而不是保留为long double.一个为15(或略高于15),另一个略低于15.int截断将此差值放大到15和14.

在另一个编译器上,由于FLT_EVAL_METHOD < 2或其他浮点特征,结果可能是相同的.


对于接近整数的数字,从浮点数转换为int是非常困难的.通常最好是round()lround().最佳解决方案取决于具体情况.

C++相关问答推荐

C++ cout打印顺序与C print相比

CC crate 示例不会与C函数链接

C中的ATONE会扰乱SEN/CLUTE GMS应用程序中的其他字符串

为什么信号量为空= 0,而不是阻塞?

你能用自己的地址声明一个C指针吗?

如何设置指针指向在函数中初始化的复合文字中的整数?

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

显式地将值转换为它从函数返回的类型的含义是什么?

在编译时参数化类型定义

如何在c++中包装返回空*的函数

getline()从c中的外部函数传递指针时输出null

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

在C中访问数组中的特定值

Boyer Moore算法的简单版本中的未定义行为

错误...的多个定义(&Q)首先在这里定义&

生产者消费者计数器意外输出的C代码

为什么我的旧式&q;函数在传递浮点数时会打印2?

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

无法在线程内用 C 打印?

可以从指针数组中的值初始化指针吗?