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

为什么编译器将浮点数的位数固定为6?

祁增
2023-03-14

根据C编程语言-第4节,第6.2.5节:

有三种浮点类型:浮点(单精度)、双精度(双精度)和长双精度(扩展精度)

参考:http://en.wikipedia.org/wiki/Single-precision_floating-point_format

真有效位包括二进制点右侧的23个分数位和值为1的隐式前导位(二进制点左侧),除非指数存储为全零。因此,内存格式中只有23个有效位的分数位,但总精度为24位(相当于log10(224)≈ 7.225位小数)。

→ 在二进制32交换格式上,浮点数的最大位数为7位。(在计算机内存中占用4字节(32位)的计算机数字格式)

当我在不同的编译器上测试时(如GCC、VC编译器)
→ 它总是输出6作为值。

查看浮动。每个编译器的h→ 我发现6是固定的。

问题:

  • 你知道为什么这里有不同(在实际值理论值7和实际值6之间)
    听起来“7”更合理,因为当我使用以下代码进行测试时,该值仍然有效,而“8”无效

代码:

#include <iostream> 
#include <limits>

using namespace std;

int main( )
{
    cout << numeric_limits<float> :: digits10 << endl;

    float f = -9999999;

    cout.precision ( 10 );

    cout << f << endl;
}

共有2个答案

杨景山
2023-03-14

<代码>标准::数值_限制

小数位数q,使得任何具有q个小数位数的浮点数都可以舍入为具有p个基数b位的浮点数,然后再次舍入,而不更改为q个小数位数,

⎧ 如果b是10的幂,则p log10 b

⎩ ⎣(p− 1) log10 b⎦ 否则

FLT\U挖掘6

DBL_DIG10

LDBL_DIG10

值为6(而不是7)的原因是舍入错误——并非所有具有7位十进制数字的浮点值都可以用32位浮动无损表示。但舍入错误仅限于1位,因此FLT_DIG值是根据23位(而不是完整的24位)计算的:

23 * log10(2) = 6.92

这四舍五入到6。

魏鸿哲
2023-03-14

你没有看留档。

std::numeric\u极限的值

标准32位IEEE 754浮点类型具有24位小数部分(写入23位,隐含一位),这可能表明它可以表示7位小数(24*std::log10(2)为7.22),但相对舍入误差是不均匀的,一些具有7位小数的浮点值无法转换为32位浮点值并返回:最小的正示例是8.589973e9,在往返后变为8.589974e9。这些舍入误差在表示中不能超过一位,数字10计算为6.92。四舍五入得到值6。

std::numeric\u极限的值

与大多数数学运算不同,只要至少使用了最大位数10,浮点值到文本和背面的转换是精确的(9表示浮点值,17表示双精度浮点值):即使中间文本表示不精确,也保证生成相同的浮点值。用十进制表示法表示浮点的精确值可能需要100多个十进制数字。

 类似资料:
  • 我经常注意到gcc在可执行文件中将乘法转换为移位。当将与相乘时,可能会发生类似的情况。例如,可能只是将的指数增加1,从而节省一些周期。如果有人要求编译器这样做(例如,通过),编译器通常会这样做吗? 编译器通常是否足够聪明来执行此操作,还是我需要自己使用或函数系列来执行此操作?

  • 这样一个看似简单的数字怎么会“太大”而无法在64位内存中表达呢?

  • 问题内容: 我想四舍五入为。 该功能无法按我预期的方式工作。 问题答案: 你遇到了浮点数的老问题,不是所有的数字都能精确地表示。命令行只是向你显示内存中的完整浮点形式。 对于浮点表示,舍入的版本是相同的数字。由于计算机是二进制的,它们将浮点数存储为整数,然后除以2的幂,因此将以类似于的方式表示。 双精度数字有53位(16位)的精度,而常规浮点数有24位(8位)的精度。Python中的浮点类型使用双

  • 由于某些原因,这部分不起作用: 我将错误“无法将«类ocid»id«数据optr000000003701000000000000»转换为类型编号。(错误-1700)” 你知道为什么会这样吗?我想这是因为它不想让我把浮点和整数结合起来。如果这是原因,为什么?我该如何修复它?如果这不是问题,你认为是什么? 谢谢!

  • 问题内容: 因此,如果我有一个范围为‘0-1024’的数字,并且希望将其取为‘0-255’,那么数学将决定将输入除以输入的最大值(在这种情况下为1024),从而得出我的数字介于0.0-1.0之间。然后将其乘以目标范围(255)。 我要做什么! 但是由于Java中的某些原因(使用处理),它将始终返回值0。 该代码将像这样简单 但是我只得到0.0。我已经尝试过两次和诠释。一切都无济于事。为什么!? 问

  • 在C++中如何将浮点数转换为字符串,同时指定精度&小数位数? 例如: