这么简单的题,计算机为什么会算错?

作者: 小刘不是程序员分类: 计算机技术 发布时间: 2024-04-12 10:16:00 浏览:188901 次

这么简单的题,计算机为什么会算错?

就地免职:
我们怀疑您是人类,请完成以下问题以继续: 1.0/5=____

【回复】回复 @2223333333366666 :老程序猿了
神奈_神威:
标题党,计算机算错的是sqrt(4)-2,而不是2-2

【回复】回复 @绯红剑姬 :他说的没错啊 确实是算sqrt(4)-2错了而不是2-2错了 出错的原因是sqrt(4)是浮点数
【回复】对,说明计算机里sqrt(4)-sqrt(4)=0
【回复】回复 @绯红剑姬 :2-2是定点数减定点数,sqrt(4)-2是浮点数减定点数,两种运算精度不同。
作死取名中请勿打扰:
sqrt(4)不等于2显然是BUG 准确地说,显然是卡马克算法没用好的BUG 使用y+=y*(half-x_half*(y*y));可以得到准确的结果(为此我甚至对f128做了测试,f32,f64,f128都可以得到真正的sqrt(4)=2)(或许应当感谢四舍六入五留双立功) 但使用y=y*(three_halfs-x2*(y*y));会带来一个bit的误差,这个误差导致了计算sqrt(4)的结果会小于2 怎么说呢,sqrt(4)不等于2显然是算法BUG,而不是0.1+0.2不等于0.3这样的硬件BUG 你两分钟的视频成功地浪费了我半个小时[热词系列_妙啊]

温柔你打野:
win10里不是做了修复,而是做了处理。 早年的安卓计算器也有这个问题,后面也是做了处理。以符合十个手指头的人类的直觉。

【回复】回复 @你拉黑我时真像篮球坤 :Windows 11的计算器用的和Windows 10版一样的代码库
子柿:
Windows的那个计算器最厉害的一点就是,0.1+0.2=0.3[吃瓜]

【回复】回复 @bili_91669991304 : 仔细看视频后面讲的,win7计算结果实际是0.30000000000000004,只是没把后面一长串给你显示出来而已,叠加多次运算后就会出错,直到win10才修复这个问题的。
【回复】一看就是py交易过来的[doge]
Coroutines_:
2这个值不应该有浮点误差,和0.1+0.2完全不是一回事。我认为是数值计算的误差。

【回复】2没问题,但“4开平方根”这个计算过程有问题[doge]
【回复】数值计算里浮点数精度不够,因为算x^y用的是e(y*ln(x))
【回复】回复 @BoYanZh :开根一般直接硬件算或者用迭代法吧
Kaiser1453:
以下这段C程序还能输出true呢[doge] unsigned int var1 = 1; int var2 = -1; if(var2>var1) printf("true");

【回复】回复 @hcymc_py : 那一定是你的问题。自动类型转换是C标准规定的,因此做运算时编译器一定会自动把有符号数解读为无符号数。假设编译链接成32位机器码,那么var1的二进制表示是31个零,最低位一个1,而var2的补码表示是32个1,底层硬件把var2减去var1,结果无零标志位和进位标志位,表明var2>var1所以条件为真。
【回复】[doge]能不能把类型统一一下
【回复】因为会自动转换为无符号整形
北白川餡子_official:
要是买过计算器,翻翻计算机的说明书就会知道都是有误差的[doge] 计算次数越多误差积累越重

【回复】回复 @疯狂看教程学习 :计算器
萌紫儿:
一般到1e-16以下的数量级就可以忽略不计了

【回复】回复 @炼狱秧秧 : 銀行、金融業用的是 BCD 儲存方式的數值型態(decimal),與 IEEE754 的浮點數儲存方式不同 至於 BCD 和 IEEE754 的不同點,搜尋一下就能明白了
【回复】回复 @lbxz :银行金融需要的数据不仅仅是钱,还需要根据市场行情算收益,算收益就得用除法
【回复】回复 @喵脑大好腻害 :额,我就是做开发金融软件的,我负责的系统到现在都还在用双精度[笑哭]别问为什么,我也想用decimal但是系统不支持
0x00024:
win7那个计算器和手机的计算器优化侧重是不一样的,不信你用手机算一下1/3 *3是不是得0.9999999…,而w7那个计算器会告诉你1

【回复】一次性输入计算就是1,分布计算就不是1。因为分步1/3就已经不准了,在手动计算你也没法写无穷小数。只能是一起计算然后划掉3等于1。所以计算器一步计算是1没问题。
【回复】回复 @liZC__ : 但计算器里的0.999...并不是0.9999..., 而是0.999...9
【回复】但是0.999999……好像可以等于1。因为1/3+2/3应该等于1,但拆开来0.333……+0.666……等于0.99999……[思考]
夕丶C:
来通知你一声:微信适配鸿蒙了。[doge]

WoroW:
我觉得这个视频是有问题的,这个错误和0.1+0.3不等于0.4完全不是一回事 sqrt(1/9)-1/3不等于0可以说浮点的问题 但是sqrt(4)=2无论是4还是2,都是可以完美用二进制表示的 核心问题在于计算器算错的是sqrt(4),问题出现在sqrt上 计算sqrt(4)时,我们期待的结果是域中和sqrt(4)最接近的数字,也就是2,但是得到的不是2 说明sqrt计算时出现了很小的计算误差 最后0.1和0.3的问题是的二进制浮点表示和数字本身之间就有差距,运算使得这个误差被累积了,和这个完全不是一个情况

【回复】回复 @_--_--_-____---_ :你是觉得谁不知道吗
【回复】冷知识,浮点数表示任何数,最后一位非0的数必定是5。即使这个数不存在小数部分
表不一:
简单,计算机也是由有限个0和1组成的,开平方根的计算是计算机无限逼近猜出来的,终归是要有一个区间,但计算机算力有限不能继续缩小范围,只能输出一个最接近答案的答案

【回复】能继续缩小,代价是时间
圆锥容球:
我记得当时学C++的时候我们老师专门说了比较两个运算出的浮点数是否相等不能直接==,要把它们相减,然后看结果的绝对值是不是小于某个值

学习 计算机 科普 电脑 编程

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!