Float 数据类型背后的概念及其赋值

标签 c floating-point type-conversion

请解释一下这两段代码背后的输出/概念。

float x;
x=(float)3.3==3.3;
printf("%f",x);

上面的输出是 0.000000

float x;
x=(float)3.5==3.5;
printf("%f",x);

上面的输出是 1.000000

最佳答案

在C源代码中,数字“3.3”代表与数字3.3非常接近的double类型的值。好的编译器会将“3.3”转换为最接近 3.3 的 double 类型的值,即 3.29999999999999982236431605997495353221893310546875,但 C 标准并不要求这样做。

表达式(float) 3.3将此 double 型转换为浮点型,从而生成最接近 double 型的浮点类型值。该值为 3.2999999523162841796875。

然后表达式(float) 3.3 == 3.3 将浮点值与 double 值进行比较。 (这会隐式地将 float 转换为 double,但在此转换过程中值不会改变。)由于值不相等,因此比较结果为 0。

由于 3.5 可以精确地表示为 double ,因此数字“3.5”精确地生成值 3.5。这也可以精确地表示为 float ,因此将其转换为 float 会产生 3.5。然后比较两个值,结果为 1。

(这个答案假设 IEEE 754 浮点,这很常见。)

关于Float 数据类型背后的概念及其赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12003279/

相关文章:

c++ - 如何在 Linux 上热重载共享库

c - 在子进程C程序中存储数据

go - 如何在 Go 中将 Float64 转换为 Base36?

c - 读入一个数组

c# - 即使签名匹配,也无法将一种类型的委托(delegate)分配给另一种

c - Fgets 在 C 编程中运行一次后被忽略?

c - 如何检测未终止的注释并向代码中的标准错误流写入 "Error: line X: unterminated comment"的错误消息?

c - 浮点乘法溢出

java - Java中的Float.valueOf(String arg)四舍五入问题

java - 执行variableOfTypeA+=variableOfTypeB时出现奇怪的类型转换