既然浮点数据类型不精确,那么浮点数存在的意义在哪?

2021-03-18 14:20:45 +08:00
 xiaokongwu

既然二进制无法精确的表示小数,那么为什么设计浮点数(float/double)这种不精确的格式,而不直接设计一种基础的,可以精确表示小数的基础数据类型呢?

IEEE 虽然规定了浮点数的格式,但这种浮点数格式仍然是不精确的,为什么不直接规定一种精确的存储格式呢? 比如整数小数分开存储,前 N 位是整数,后 N 位是小数,再来几位存 scale/precision 之类的设计,就像 Java 里的 BigDecimal 一样

8699 次点击
所在节点    Java
83 条回复
lithiumii
2021-03-18 14:26:12 +08:00
需要精确的时候,用你的语言里已经实现或者自己实现啊
Kr98
2021-03-18 14:28:46 +08:00
你想精确到多少位都可以,但总要有个限制吧,硬盘不是无限大的。
Kasumi20
2021-03-18 14:33:40 +08:00
0.99999999 === 1
ysc3839
2021-03-18 14:46:01 +08:00
关键就在于“浮动”吧,精度可以随数值而变化。
至于为什么没把别的小数存储方案进行标准化,我也不知道。
across
2021-03-18 14:48:31 +08:00
先问问你自己,“精准”的意义在哪里
anzu
2021-03-18 14:51:58 +08:00
运算效率
qwerthhusn
2021-03-18 14:55:25 +08:00
现在 CPU/GPU 应该都有浮点运算指令
marcong95
2021-03-18 14:55:25 +08:00
规定的是浮点数存储格式,而不是十进制数存储格式,并不是让你当十进制用的,计算机是个二进制的机器,你看到的十进制数只不过是格式化的结果而已。IEEE754 也不是给你用的,是给计算机用的。
geelaw
2021-03-18 14:56:16 +08:00
今日震惊小知识:你说的那种 decimal 也是浮点数。

浮点数和定点数是表示某进位制下有限小数的方法,然而楼主的问题和浮点不浮点没关系。
有限长度,无论什么编码都不能精确表达所有有理数;长度无上界时可以高效、精确表达所有有理数;不需要高效的时候可以表达所有可计算数;然而无论如何都无法表达所有实数。

很多场景不需要精确,但需要速度,所以采用简短但不精确的表达。它的意义在于够用。
rnicrosoft
2021-03-18 15:01:27 +08:00
talk is cheap,你先来设计一个能把圆周率精确存了的小数看看?
chenluo0429
2021-03-18 15:01:52 +08:00
牺牲精度换来的是更大的范围,更快的运算速度。同样是 32 位,float 最大值可以到 3.40282346638528860e+38,int 只能到 2,147,483,647 。
xiaokongwu
2021-03-18 15:02:39 +08:00
哇,第一次在 V2EX 发帖,大家这么热情
xiaokongwu
2021-03-18 15:05:15 +08:00
@rnicrosoft 我描述的不是很清楚……针对那种非无限小数,可以精确表示吧,不是圆周率这种
xiaokongwu
2021-03-18 15:06:33 +08:00
@lithiumii 比如 BigDecimal ( java ),这个毕竟是对象,实际的占用比基础类型大得多,如果有基础的精确类型就可以省去这个额外开销了
xiaokongwu
2021-03-18 15:08:23 +08:00
@marcong95 嗯能理解,不过那 float/double 这种浮点数字类型存在的意义在哪呢,除了占用低,完全不能拿来做运算
xiaokongwu
2021-03-18 15:13:03 +08:00
@geelaw 感谢解释。不过 java 中的 BigDecimal 貌似是把小数部分作为整数存储的,这也可以叫浮点数吗……float/double 这种基础类型虽然可以近似的表示小数,但是一计算就会出现精度问题,我现在理解这种基础类型有存在的价值(毕竟不是所有场景都需要运算),但是如果直接提供一种基础的 BigDecimal 类型,那不是更好吗
zxCoder
2021-03-18 15:13:30 +08:00
省空间?
xiaokongwu
2021-03-18 15:14:47 +08:00
@chenluo0429 也能理解这种基础的 float/double 存在的意义,不过提供一种基础的 Decimal 类型不是更好嘛,总比上层实现的占用低
ylrshui
2021-03-18 15:15:55 +08:00
早期 8 位计算机,16 位计算机,软盘甚至纸带时代,省存储空间,也节省运算量
ylrshui
2021-03-18 15:18:45 +08:00
@xiaokongwu 任何一种 Decimal 类型在数据表示的密度都不会比 float 和 double 大

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/762814

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX