- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
http://www.gotw.ca/gotw/067.htm中有一个例子
int main()
{
double x = 1e8;
//float x = 1e8;
while( x > 0 )
{
--x;
}
}
当你把double改成float时,在VS2008中就是一个无限循环。根据 Gotw 的解释:
What if float can't exactly represent all integer values from 0 to 1e8? Then the modified program will start counting down, but will eventually reach a value N which can't be represented and for which N-1 == N (due to insufficient floating-point precision)... and then the loop will stay stuck on that value until the machine on which the program is running runs out of power.
据我所知,IEEE754 float 是单精度(32 位), float 的范围应该是 +/- 3.4e +/- 38,并且它应该有 7 位有效数字。
但我仍然不明白这到底是怎么发生的:“最终达到一个无法表示的值 N,并且 N-1 == N(由于浮点精度不足)。”有人可以尝试解释这一点吗?
一些额外信息:当我使用 double x = 1e8 时,它在大约 1 秒内完成,当我将其更改为float x = 1e8,它运行的时间更长(5 分钟后仍在运行),如果我将它更改为 float x = 1e7;
,它会在大约 1 秒内完成。
我的测试环境是VS2008。
顺便说一句,我不询问基本的 IEEE 754 格式解释,因为我已经理解了。
谢谢
最佳答案
好吧,为了论证,假设我们有一个处理器,它表示一个具有 7 位有效小数位的 float ,以及一个具有 2 位小数位的尾数。所以现在数字 1e8 将存储为
1.000 000 e 08
(其中“.”和“e”不需要实际存储。)
现在您要计算“1e8 - 1”。 1表示为
1.000 000 e 00
现在,为了进行减法,我们首先进行无限精度的减法,然后归一化,以便“.”之前的第一个数字。介于 1 和 9 之间,最后四舍五入到最接近的可表示值(例如,盈亏平衡)。 "1e8 - 1"的无限精度结果是
0.99 999 999 e 08
或归一化
9.9 999 999 e 07
可以看出,无限精度结果需要比我们的架构实际提供的多一位有效数字;因此我们需要将无限精确的结果四舍五入(并重新归一化)到 7 位有效数字,从而得到
1.000 000 e 08
因此你以“1e8 - 1 == 1e8”结束并且你的循环永远不会终止。
现在,实际上您使用的是 IEEE 754 二进制 float ,它们有点不同,但原理大致相同。
关于c++ - Gotw 67 中的一个例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6995950/
谁能给我一个关于如何使用函数 crypt_r() 的例子吗? 在手册页中,不清楚返回的 char * 字符串是指向函数本身内部(在堆中)分配的内存块,还是仍然指向静态内存,如 crypt()? 最佳答
在 Spectre 中paper ,有一个利用越界数组访问的示例(第 1.2 节)。代码是 if (x < array1_size) y = array2[ array1[x] * 256 ];
这是 Grammar: difference between a top down and bottom up? 的后续问题 我从这个问题中了解到: 语法本身不是自上而下或自下而上的,而是解析器 有些
在java的构造函数中声明变量合法吗?示例。 Time(){ long timeMill = System.currentTimeMillis(); int secon
我一直在仔细研究 slick grid 的示例,并且想要 ping SO 社区并查询 Excel 电子表格编辑演示的示例?就存储而言,网格仅存储整数数据,并且网格将托管在 mvc3 razor 页面内
我很难将愚蠢的菜单置于我网站页面的中心。我知道我可以将外部 div 的宽度设置为 px 值,但我怎样才能让它以响应式网站为中心?这是页面: http://103.4.17.225/~america/i
我正在寻找可在 wordpress 上使用的主题。有时,页面会在调整大小的网络浏览器上正确加载,但在移动设备上却不能,即使尺寸相同,它也会加载某种错误(通常是错位)。例如,在此页面中 ( http:/
union { unsigned char raw[8]; struct { uint8_t gz_method; uint8_t flag;
我想使用 matchShapes() 函数在查询图像中查找对象。 假设我有一本书的模型图像,我想提取它的形状,然后尝试在另一幅图像中找到这本书(它的形状)。 我在谷歌上搜索了很多,但找不到任何关于如何
我正在寻找一个使用 inotify 的简单、简洁的示例gem 来检测目录的更改。 它缺少示例。 最佳答案 examples/watcher.rb 中有一个示例.该链接指向 aredridel 的 re
我一直在努力学习编程中的递归是什么,我需要有人来确认我是否已经完全理解它是什么。 我尝试考虑的方式是通过对象之间的碰撞检测。 假设我们有一个函数。当确定发生碰撞时调用该函数,并使用对象列表调用它以确定
我正在尝试学习如何在我正在处理的项目中使用 jBullet,我已经查看了源提供的演示,但我只是无法弄清楚这些演示如何显示对象。谁有好的资源可以指点我或提供一个在屏幕上显示一个或两个对象的基本示例? 在
我想在一个简单的 x,y 图表上绘制线条,以使用 JGraphT 在 JApplet 中显示。我找到的例子不是很有帮助。有人可以给我指出一些简单的 JGraphT 示例吗? 最佳答案 这里有一个例子,
在解决几何问题时,我遇到了一种称为滑动窗口算法的方法。 真的找不到任何关于它的学习 Material /细节。 算法是关于什么的? 最佳答案 我认为它更像是一种技术而不是一种算法。这是一种可用于各种算
我正在学习同步方法,以防止 Java 中的竞争条件和不良行为。我看到了以下示例,并被告知竞争条件非常微妙: public class Messages { private String messa
我有 100 万个 pdf,如何使用 hadoop 转换为文本并将其用于分析。目标是利用 hadoop 的强大功能将 pdf 数据提取为文本。 最佳答案 我已经在 Hadoop 上处理了一个 pdf
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我读到过,由于堆栈展开,从析构函数中抛出不是一个好主意。我不确定我是否完全理解。所以我尝试了下面的例子 struct foo { ~foo() { throw 1;
任何人都可以告诉我一个简单的(代码)示例来展示 response.encodeURL() 的用法吗?我所有的搜索(包括 google 和 stackoverflow)只提供了 encodeURL()
我受困于 haskell 类型。 {-# LANGUAGE OverloadedStrings #-} module Main ( main ) where import qualified
我是一名优秀的程序员,十分优秀!