【问题标题】:Concept behind Float datatype and its assignmentFloat 数据类型及其赋值背后的概念
【发布时间】:2012-08-17 09:34:06
【问题描述】:

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

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

【问题讨论】:

  • 以二进制形式写入 3.33.5。请记住 doublefloat 具有更高的精度。
  • 我不知道您将 bool 值分配给 float 变量背后的概念是什么。
  • 另外:总是使用double;不要无缘无故使用float(因为老师说的不是好理由)

标签: c floating-point type-conversion


【解决方案1】:

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

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

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

由于 3.5 可以精确地表示为双精度数,因此数字“3.5”产生的正是值 3.5。这也可以精确地表示为浮点数,因此将其转换为浮点数会产生 3.5。然后比较这两个值产生 1。

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

【讨论】:

    【解决方案2】:

    3.3 不能完全用二进制浮点表示(它包含重复出现的小数部分)。将 double 文字 3.3 转换为 float 并转换回 double 以与 3.3 进行比较会丢失精度,因此比较不相等。

    对于 IEEE 64 位 double 和 32 位 float

    • 文字3.3 表示为0x1.a666666666666p+1
    • 文字3.3f 表示为0x1.a66666p+1,因此(float) 3.3 将是相同的
    • 提升回双倍,我们得到0x1.a666660000000p+1,显然不等于3.3

    另一方面,3.5floatdouble(如0x1.cp+1)中完全可以表示,所以比较是相等的。

    比较结果为1(相等)或0(不相等),并且您将比较结果打印为浮点数。

    【讨论】:

    • 您能否详细说明您的答案的第 1 段?
    • @AmitAgarwal 请查看此链接:fourier.eng.hmc.edu/e85/lectures/arithmetic_html/node11.html,然后转到“IEEE 754 示例”部分。顺便说一句,很好的答案。
    • 这有点不准确;导致这个问题的不是 3.3 不能完全用二进制浮点表示的事实,而是从源文本“3.3”产生的双精度不能完全表示为浮点的事实。例如,7.000000476837158203126 不能完全用二进制浮点表示,但在比较中会产生 1。
    【解决方案3】:

    3.3 不是 float 而是 double:您正在比较具有不同精度的数字。

    【讨论】:

    • 那为什么3.5的结果不同?
    • 比较前将值转换为相同类型
    • @pmg (float)3.3==3.3:在== 的左侧操作数中,值3.3 转换为float,然后转换为double,而在右侧操作数中不发生转换。跨度>
    • (double)(float)3.33.3 的精度相同(约 15 位)。不过他们的价值观不同。
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2019-03-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2012-09-25
    相关资源
    最近更新 更多