【问题标题】:Why Does Not My Program Works ???Float Casting为什么我的程序不起作用???浮动铸造
【发布时间】:2015-10-21 20:08:40
【问题描述】:

没有任何内容被打印为输出,但是当我写 while(x==3.1f) 时它可以工作。 我已经彻底寻找答案,我什至找到了一些,但它并没有真正帮助我。人们已经回答说使用 f 作为后缀使其浮点默认类型为双精度。但它是如何真正起作用的......我希望有人在初学者级别向我解释。我刚刚开始学习 C 编程语言。请不要将此问题标记为之前已回答,因为我已经阅读了所有这些答案,但我仍然无法说服自己。 我还想知道后缀 f 究竟做了什么 .. 以及小数如何存储在 binary 中。我们为什么不简单给。作为另一个二进制代码,并像我们对整数所做的那样进行。我可能会问一些愚蠢的问题。但我真的很困惑

include<stdio.h>

int main()
{
   float x = 3.1 ;
while(x==3.1)
{
printf("%f\n",x);
x=x-0.1;


}

return 0;

}

【问题讨论】:

    标签: casting floating-point double


    【解决方案1】:

    3.1,在 C 程序中,表示最接近小数 3.1 的 double。假设 IEEE 754 二进制浮点,最常见的实现,其精确值为 3.100000000000000088817841970012523233890533447265625

    当您将其分配给x 时,它会转换为最接近的float,3.099999904632568359375。

    floatdouble 之间的比较是通过将 float 转换为 double 并比较双精度来完成的。

    floatdouble 的所有转换都是精确的,因此只有当 3.099999904632568359375 等于 3.100000000000000088817841970012523263890533447 时,while 条件才会为真

    floatdouble 转换的准确性不仅仅是doublefloat 占用更多空间的问题。 IEEE 二进制浮点数具有三个字段,一个符号位、一个二次幂指数和一个有效数。 float 指数和有效数字范围是相应双精度范围的真子集。

    在更广泛的问题上,floatdouble 非常紧凑和高效,比 Java 的 BigDecimal 等十进制缩放类型高效得多。代价是它们是科学记数法的二进制版本,不能准确表示大多数小数。

    【讨论】:

    • 从 float 到 double 的所有转换都是精确的,这是什么意思?我怎样才能看到确切的值?如何使用任何函数打印确切的值?没有双精度的格式说明符吗?我怎样才能打印出你写的确切数字,看看它们是如何转换的??
    • @SurajJain 对于每个浮点数,都有一个具有完全相同值的双精度数。我使用 Java 进行打印输出,因为它有一些使它变得容易的特性。我也使用在线Decimal to Floating-Point Converter
    • 所有从 float 到 double 的转换都是精确的,因为 float 只有 4 字节,而 double 是 8 字节,所以 double 比 float 具有更高的精度,所以它不会丢失任何精度,而当我们将 double 转换为float 它会失去精度,因为 float 的大小小于 double ,因此它无法包含精度。我对吗 ???还是我在某个地方错了,这就是我理解 float 到 double 之间的转换是准确的。如果我在某处错了,请纠正我......
    • @SurajJain 我已经扩展了浮动到双重转换的问题。我不打算评论 C 材料。我的 C 专业知识已经过时了,无论如何,书籍推荐对于 SO 来说都是题外话。我建议在网络上搜索评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    相关资源
    最近更新 更多