将双精度舍入到最接近的非次正规表示

Posted

技术标签:

【中文标题】将双精度舍入到最接近的非次正规表示【英文标题】:Round double to nearest non subnormal representation 【发布时间】:2019-12-12 17:50:48 【问题描述】:

在 C++ 中,(有时)subnormal doubles 是有限的,而不是 nan 并且不是零。

如何将它们四舍五入到最接近的非次正规双精度表示?

例如:std::isnormal(DBL_MIN/2.0) = false

【问题讨论】:

有趣的问题。您能否详细说明您为什么要这样做?一系列if 语句不会起作用吗? 【参考方案1】:

所有次正规的双星等都在 0 和 DBL_MIN 之间。如果一个值小于DBL_MIN,只需将其与DBL_MIN/2 进行比较,将其四舍五入为其中之一。 (为了匹配通常的 IEEE-754 舍入行为,DBL_MIN/2 本身应舍入为 0。)

【讨论】:

一半的次正规值在-DBL_MIN和零之间。 @EricPostpischil 是的,我决定将其作为对读者的顿悟。 DBL_MIN 和 0 都有偶数。虽然 0 当然是无限偶数,但我不知道这里有什么规则可以选择。 @DavisHerring 我的想法是 0 比 DBL_MIN 具有更纯粹的零有效位;常规舍入规则和舍入为整数的规则更喜欢带有更多尾随零的结果。但我同意这些规则没有明确扩展。

以上是关于将双精度舍入到最接近的非次正规表示的主要内容,如果未能解决你的问题,请参考以下文章

将双精度数舍入到 x 有效数字

如何优化 spark 函数以将双精度值舍入到小数点后 2 位?

如何在 PHP 中舍入到最接近的 3 倍数? [复制]

将分钟向下舍入到最接近的一刻钟

将 DateTime 舍入到最接近的半小时 [重复]

为啥 as_tibble() 将浮点数舍入到最接近的整数?