首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么浮点数是不准确的?

为什么浮点数是不准确的?
EN

Stack Overflow用户
提问于 2014-02-20 08:39:02
回答 2查看 53.5K关注 0票数 231

为什么有些数字在存储为浮点数时会失去准确性?

例如,十进制数9.2可以精确地表示为两个十进制整数(92/10)的比率,这两个整数都可以精确地表示为二进制(0b1011100/0b1010)。但是,存储为浮点数的相同比率永远不会完全等于9.2

代码语言:javascript
复制
32-bit "single precision" float: 9.19999980926513671875
64-bit "double precision" float: 9.199999999999999289457264239899814128875732421875

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

EN

回答 2

Stack Overflow用户

发布于 2014-02-26 03:13:31

虽然所有其他答案都是好的,但仍然缺少一件事:

表示无理数是不可能的(例如,sqrt(2)**,** log(3)**, π等)准确地说!**

这实际上就是它们被称为非理性的原因。世界上任何数量的比特存储都不足以容纳它们中的一个。只有符号算术才能保持它们的精度。

但是,如果您将您的数学需求限制为有理数,那么精度问题就变得可控了。您需要存储一对(可能非常大的)整数ab,以保存分数a/b表示的数字。你所有的算术运算都必须像高中数学一样做分数运算(例如a/b * c/d = ac/bd)。

但当然,当涉及到pisqrtlogsin等时,你仍然会遇到同样的麻烦。

TL;DR

对于硬件加速算法,只能表示有限数量的有理数。每个不可表示的数字都是近似的。有些数字(即无理数)永远不能表示,无论系统是什么。

票数 15
EN

Stack Overflow用户

发布于 2019-04-20 21:43:23

有无限多的实数(如此之多以至于你不能枚举它们),也有无限多的有理数(可以枚举它们)。

浮点表示是有限的(就像计算机中的任何东西一样),因此不可避免地会有许多数字无法表示。特别是,64位只允许您区分18,446,744,073,709,551,616个不同的值(与无穷大相比,这算不了什么)。对于标准约定,9.2不在其中。对于某些整数m和e,可以是m.2^e的形式。

您可能会想出一个不同的计数系统,例如,以10为基数,其中9.2将具有精确的表示。但其他数字,比如1/3,仍然不可能表示出来。

还要注意,双精度浮点数是非常精确的。它们可以用多达15位的精确数字来表示非常宽范围内的任何数字。对于日常生活计算,4或5位数就足够了。你永远不会真的需要这15个,除非你想计算你生命中的每一毫秒。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21895756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档