当前位置: 首页 > 知识库问答 >
问题:

如何在C语言中获得可表示的最小浮点值

钱稳
2023-03-14

我有一个程序,我需要将一个变量设置为C中最低的可表示(非无限)双精度浮点数。如何将变量设置为最低的双精度浮点值?

我尝试使用std::numeric_limits。我没有使用C 11,所以我无法尝试使用最低()函数。我尝试使用max(),但是当我尝试它时,它返回无穷大。我还尝试从max()中减去一个值,希望这样我就可以得到一个可表示的数字。

double max_value = std::numeric_limits<double>::max();
cout << "Test 1: " << max_value << endl;    
max_value = max_value - 1;
cout << "Test 2: " << max_value << endl;
double low_value = - std::numeric_limits<double>::max();
cout << "Test 3: " << low_value << endl;
cout << "Test 4: " << low_value + 1 << endl;

输出:

Test 1: inf
Test 2: inf
Test 3: -inf
Test 4: -inf

如何将上面示例中的low_值设置为最低的可表示双精度?

共有3个答案

麻鹏鹍
2023-03-14

事实证明,我用来打印值的iostream中有一个bug。我改用cstdio而不是iostream。然后按预期打印这些值。

double low_value = - std::numeric_limits<double>::max();
cout <<"cout: " << low_value << endl;
printf("printf: %f\n",low_value);

输出:

cout: inf
printf: 179769...
韩阳飙
2023-03-14

标准库

这个问题有点含糊不清——不清楚你是指最小的幅度可表示的非零值(这将是DBL_MIN)还是最低的可表示值(由-DBL_MAX给出)。不管怎样——根据需要选择。

怀洛华
2023-03-14

一旦你有了-inf(你得到了它),你就可以用下一个函数(-inf,0)得到最小的有限值。

编辑:根据上下文,如果DBL_MAX以十进制表示(因此不精确),则这可能比-DBL_MAX更好。然而,C标准要求以默认舍入模式(即最接近)计算浮动常数。在GCC的特殊情况下,DBL_MAX是一个长的双精度值,转换为double;然而,长双精度值似乎有足够的位数,因此,一旦从十进制转换为长双精度,该值就可以精确地表示为双精度,因此转换是精确的,并且活动舍入模式不会影响它。正如你所看到的,这是相当棘手的,人们可能希望在各种平台上检查它在任何情况下都是正确的。同样地,我对GCC在PowerPC上定义的DBL_EPSILON的正确性有严重的怀疑(其中长双精度类型被实现为双双精度算术),因为有许多长双精度值非常接近二的幂。

 类似资料:
  • 这是我的doubht List chars=new ArrayList(); 上述列表中包含的值是[A, A, B, B, C, D, E]; 我想得到一个作为输出,因为这是根据ascii的最小值。如何在java中获取此值。

  • 我试图得到浮点数的尾数(只是为了学习),但它没有按预期工作。 比如说5.3的尾数是53,对吗?我尝试了以下代码: 它打印了2726298。它不应该去掉指数位并留下53吗?我尝试了很多事情,但总是这样。我做错了什么?

  • 有没有一种方法可以获得小于的浮点类型所代表的最大值。 我看到了以下定义: 但我们真的应该这样定义这些价值观吗? 根据标准,d::numeric_limits

  • 浮点是C语言中定义的实现,因此没有任何保证。 我们的代码需要可移植,我们正在讨论是否可以在协议中使用IEEE754浮动。出于性能考虑,如果我们在发送或接收数据时不必在定点格式之间来回转换,那就太好了。 虽然我知道平台和架构之间在或的大小上可能存在差异。但我似乎找不到任何关于和的具体信息。 到目前为止,我发现在big endian平台上字节顺序可能会颠倒。虽然有些平台不支持浮点运算,但包含和的代码甚

  • 问题内容: Python是否提供了获取浮点值的功能,该函数是通过将现有浮点值的最低有效位递增而得到的? 我正在寻找类似于C ++ 11中添加的功能的东西。 问题答案: 这里有五个(实际上是四个半)解决方案。 解决方案1:使用Python 3.9或更高版本 2020年10月发布的Python 3.9包括一个新的标准库函数,该函数直接提供此功能:用于将下一个浮点数向正无穷大。例如: 如果查看方法提供的

  • Go语言提供了两种精度的浮点数 float32 和 float64,它们的算术规范由 IEEE754 浮点数国际标准定义,该浮点数规范被所有现代的 CPU 支持。 这些浮点数类型的取值范围可以从很微小到很巨大。浮点数取值范围的极限值可以在 math 包中找到: 常量 math.MaxFloat32 表示 float32 能取到的最大数值,大约是 3.4e38; 常量 math.MaxFloat64