【发布时间】:2021-03-22 21:13:39
【问题描述】:
有没有办法用数学方法确定一个值是否比另一个值更接近 0?
例如closerToZero(-2, 3) 将返回-2。
我尝试删除符号,然后比较最小值的值,但我会分配初始数字的无符号版本。
a 和 b 是符合 IEEE-754 的浮点双精度数(js 数)
(64 位 => 1 位符号 11 位指数 52 位小数)
min (a,b) => b-((a-b)&((a-b)>>52));
result = min(abs(a), abs(b));
// result has the wrong sign ...
【问题讨论】:
-
其他语言可能有
argmin而不是min。如果该语言的标准库中确实没有这样的功能,那么通过对值列表进行简单的迭代来编写代码是很容易的。但是,您的问题并未询问特定语言。事实上,你的问题究竟是什么真的不清楚。 -
在数学中你会这样写:a 如果 abs(a)
-
@Henry:在使用 2 补码整数的固定语言中,请确保对
abs结果进行无符号比较,以便正确处理abs(INT_MIN)(如果已签名)会溢出到 INT_MIN,即使它最大程度地远离 0。但是,abs(a) < (unsigned) abs(b) ? a : b应该在abs的返回值被愚蠢地签名的语言中工作。除了仍然涉及 C 中的带符号溢出,这是未定义的行为,如果 abs 实际上已完成签名。所以你真的很想将自己的absu(int)实现为return x<0? 0U - x : x; -
您可以通过将正数映射为负数来避免 INT_MIN 问题,反之亦然。
-
是
a和b整数还是浮点数?
标签: algorithm math micro-optimization branch-prediction absolute-value