【问题标题】:Division of double and float in c [duplicate]c中的double和float的除法[重复]
【发布时间】:2020-09-03 20:08:00
【问题描述】:

我相信 double 具有 x2 精度的 float 。

在我的计算器中,10/3 是 3.3333333333333333333333333333333

当我执行以下代码时:

#include <stdlib.h>
#include <stdio.h>


void main() {


    double var = (double )10 / (double )3;
    float var2 = (float )10 / (float )3;


    printf("%f %f \n" , var , var2 );

}

我在 3 之后得到相同的位数,:

3.3333333333333335 3.3333332538604736

为什么我得到相同的位数?为什么价值不同?以及如何对 double 和 float 进行除法并获得 c 中的所有数字和数字(就像在我的计算器中一样)?

【问题讨论】:

  • 您确实意识到 3.33333 中有无数个数字...如果您想要它们“全部”,这将需要一段时间。
  • 因为10/3 不能用浮点变量精确表示。该代码不是打印10/3,而是尝试将其存储在具有有限存储空间的变量中的结果。您的计算器适合其显示所需的精度。
  • @WeatherVane 和其他人,好奇,你能详细说明一下吗? Windows 计算器显示 31 个“3”位小数。知道它是否使用某种比double 更大/更精确的内部数据类型?也许它有一个常用分数 ==> 十进制转换的查找表?我做了零研究。
  • @yano 必须优于 double,后者仅对 16 位有效数字有用。如果你想研究,现在是open source
  • 根据 C 2018 7.21.6.1 7,使用 %f 的转换会在小数点后产生六位数字。如果你得到“3.3333333333333335”,那么要么你没有使用%f,要么你的C实现有缺陷。

标签: c double division digits


【解决方案1】:

默认情况下printf 只会打印有限的数字。在我的系统上,它是 6 位数字。在您的系统上,它似乎是 16 位数字。

要打印更多数字,请执行以下操作:

    printf("%.60f \n%.60f \n" , var , var2 );

输出:

3.333333333333333481363069950020872056484222412109375000000000 
3.333333253860473632812500000000000000000000000000000000000000 

如您所见,floatdouble 都无法打印

3.333333333333333333333333333333333333333333333333333333333333

但是 - 显然 - doublefloat 更接近。

顺便说一句:这不是void main() {。应该是int main(void) {

【讨论】:

  • 应该是 int main(void)。最新的规范对此有所放松。
  • AFAIK,当使用printf时,浮点数使用%f,但双精度数使用%lf(长浮点数)...
  • @Myst 打印时没有。
  • @Myst 您对 scanf 感到困惑,这是不同的。传递给printffloat 被提升为double。在 printf 中,double 的格式规范为 %f
  • C 标准规定 printf 中浮点转换的精度默认为 6,而不是实现定义的值。要获得 16 位精度,您需要明确指定精度。
猜你喜欢
  • 2019-06-11
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
相关资源
最近更新 更多