c++ - 是否可以对 float 逼近的不同形式进行分类

标签 c++ double floating

我只是想知道我们是否可以为使用 float 的实数逼近形式制定规则。

例如,一个 float 可以由 1.xxx777777 终止(因此实例由无限 7 终止,最后是一个随机数字)?

我相信只有这种形式的 float :

1.精确值。

2. 值如 1.23900008721.... 所以 1.239 近似于显示为“噪声”但之间为 0 的数字确切的值(value)和这个噪音

3. 值,例如 3.2599995,其中 3.26 是通过添加 9999.. 和最后一位数来近似计算的(如 5),所以用一个略低于实数的 float 来近似

4. 值,如 2.000001,其中 2.0 近似为一个略高于实数的 float

最佳答案

您正在考虑十进制数,即可以表示为 n*(10^e) 的数字,e 可以是正数也可以是负数。由于与十根手指有关的历史原因,这些数字自然会出现在您的思维过程中。

计算机数字以二进制表示,出于与电信号存在或不存在有关的技术原因。

当您处理较小的整数时,计算机表示与您自己的不匹配并不重要,因为您正在考虑数学数字的精确近似值,计算机也是如此,因此通过传递性,你和计算机在思考同一件事。

对于非常大或非常小的数字,您倾向于以 10 的次方来思考,而计算机肯定会以 2 的次方来思考。在这些情况下,您可以观察到您的直觉与计算机所做的不同,而且您的分类是无稽之谈。二进制 float 在碰巧具有十进制数紧凑表示的数字附近既不密集也不疏密。它们只是用二进制表示,n*(2^p)p 可以是正数也可以是负数。许多实数只有十进制的近似表示,而许多实数只有二进制的近似表示。这些数不相同(二进制数可以用十进制表示,但并不总是紧凑的。有些十进制数根本不能用二进制精确表示,例如 0.1)。

如果您想了解计算机的 float ,您必须停止思考小数。 1.23900008721.... 并不特殊,1.239 也不是。 3.2599995 并不特殊,3.26 也不是。您认为它们很特别,因为它们正好或接近于紧凑的十进制数。但这对二进制 float 没有任何影响。


这里有一些可能会让您觉得有趣的信息,因为您将问题标记为 C++:

如果您打印格式为 %.16e 的 double ,您将得到一个转换回原始 double 的十进制数。但它并不总是代表原始 double 的准确值。要以十进制形式查看 double 的准确值,您必须使用 %.53e。如果您在程序中编写 0.1,编译器会将其解释为 1.000000000000000055511151231257827021181583404541015625e-01,这是一个相对紧凑的二进制数。你的问题谈到 3.2599995 和 2.000001 就好像它们是 float 一样,但它们不是。如果您在程序中写入这些数字,编译器会将它们解释为 3.25999950000000016103740563266910612583160400390625 和 2.00000100000000013977796697872690856456756591796875。因此,您正在寻找的模式很简单: float 的十进制表示始终是 17 位有效数字,后跟 53-17 = 36 位您所说的“噪声”数字。噪声数字有时全为零,有效数字也可能以一串零结尾。

关于c++ - 是否可以对 float 逼近的不同形式进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731846/

相关文章:

C++ Boost 程序选项崩溃

c# - 为什么 5/10 = 0.0?

c++ - 可靠地使用 double 作为 std::map 键

java - WindowManager float 窗口穿过屏幕边框

c++ - 虚幻引擎 : Can it be done primarily with C++/scripting instead of Blueprints?

c++ - iPhone编译移植代码问题: calling a static templated function that's inside a templated class == fail

html - 在同一行 float <p> 和 <ul> 元素

c# - WPF - 创建 float 动画可点击控件(图像或...)

c++ - 在执行二进制序列化时删除 stringstream 结果的 const-ness 是否安全?

c# - 将 double 转换为 int,它是四舍五入还是只是去掉数字?