首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >floor函数中的错误

floor函数中的错误
EN

Stack Overflow用户
提问于 2017-01-27 00:28:29
回答 2查看 163关注 0票数 2
代码语言:javascript
复制
floor(-1e-14 % 2)
Out[1]: 1.0

floor(-1e-16 % 2)
Out[2]: 2.0

我知道-1e-16可能离0太近了,但是% 2运算后的floor的结果绝不应该是2 (0或1)!

EN

回答 2

Stack Overflow用户

发布于 2017-01-27 00:33:01

这不是%的结果在floor.Check中的错误

代码语言:javascript
复制
In [61]: -1e-16 % 2
Out[61]: 2.0

In [62]: -1e-14 % 2
Out[62]: 1.99999999999999

你可以阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic,以了解更多关于%为什么会这样做的信息。

decimal模块提供对十进制浮点算术的支持。与foat数据类型相比,它有几个优点。因此,对于浮点值的精确数学计算

sys.float_info

有关浮点类型的详细信息,可以使用sys.flaot_info

sys.float_info.dig显示可以在浮点型中如实表示的最大小数位数;对于包含更多位数的计算,您可能不希望在给定精度下得到准确的结果

这就是我得到的

代码语言:javascript
复制
In [217]: import sys

In [218]: sys.float_info.dig
Out[218]: 15
票数 6
EN

Stack Overflow用户

发布于 2017-01-27 00:39:40

您说得对,-1e-16的结果不应该是2.0,但是浮点数很奇怪,而且不太精确。%运算符states规范

虽然abs(x%y) < abs(y)在数学上是真的,但对于浮点数,由于舍入,它在数值上可能不是真的。例如,假设平台上的Python浮点数是IEEE 754双精度数,为了使-1e-100% 1e100具有与1e100相同的符号,则计算结果为-1e-100 + 1e100,在数值上恰好等于1e100。函数math.fmod()返回其符号与第一个参数的符号匹配的结果,因此在本例中返回-1e-100。哪种方法更合适取决于应用程序。

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

https://stackoverflow.com/questions/41878277

复制
相关文章

相似问题

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