根据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;
}
<代码>标准::数值_限制
小数位数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。
你没有看留档。
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++中如何将浮点数转换为字符串,同时指定精度&小数位数? 例如: