首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >浮点,它什么时候出现的,它是如何工作的

浮点,它什么时候出现的,它是如何工作的
EN

Stack Overflow用户
提问于 2011-07-13 06:14:33
回答 2查看 142关注 0票数 2

据我所知,float可以精确地表示14个数字。

所以让我们假设我们有

代码语言:javascript
运行
复制
a = 564214623154
b = 54252

我们将这个c=a*b相乘,它应该是30609771735350808,但当编译它时,它显示3.0609771735351E+16,所以据我所知,它应该会失去一些精度,但当我用c除以c/a时,我得到了564214623154的准确结果,而没有任何精度损失

再举一个例子,假设我们有

代码语言:javascript
运行
复制
c = 30609771735350808 
d = 30609761111111111

e=c-d应为10624239697,但在编译时显示为10624239696,因此会丢失精度

那么,只有当我减去或相加两个数字时,精度才会丢失吗?

如果重要的话,我使用php

EN

Stack Overflow用户

回答已采纳

发布于 2011-07-13 06:25:08

使用乘法和除法也有可能失去精度。PHP和JavaScript以IEEE754格式存储数字,尾数为52位,指数为11位。有些整数是精确表示的,有些则不是。

让我们试试这些:

在Real Math中(用Ruby生成):

代码语言:javascript
运行
复制
45345657434523 * 9347287748322342 / 74387422372 = 5697991604786167788

在PHP和JavaScript中

代码语言:javascript
运行
复制
45345657434523 * 9347287748322342 / 74387422372 = 5697991604786168000

所以我们也会损失乘法和除法的精确度。

编辑:在重新讨论OP的问题时,这似乎不是一个很好的答案,因为结果包含超过15个十进制数字的精度。如果问题的目的是将一组数字相乘和相除,其中每个数字都以15位或更少的精度表示,那么最终结果往往会保持很高的精度(前提是您不会溢出或下溢)。所以你可以将1.25E35 * 2.5E7相乘,得到精确的3.125e+42,因为PHP和JavaScript基本上会将有效数字的组相乘,并将指数相加。但是,如果将这两个值相加,则会得到1.25E35 + 2.5E7 = 1.25E35。没错,你给一个数字加上2500万,它就不会改变!这是因为,正如操作员所说,您只能获得14或15位小数位的精度。尝试通过写出120000000000000000000000000000000000 + 25000000来手动添加这两个值。14-15位数字从左边开始计数,你不能把它们都拿起来。

底线是精度问题更有可能与加法和减法一起出现。很高兴知道这一点。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6671853

复制
相关文章

相似问题

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