考虑以下 C++ 代码:
double someZero = 0;
std::cout << 0 - someZero << '\n'; // prints 0
std::cout << -someZero << std::endl; // prints -0
问题是:负零有什么好处,是否应该避免使用它(即使用减法而不是在变量上加上负号)?
考虑以下 C++ 代码:
double someZero = 0;
std::cout << 0 - someZero << '\n'; // prints 0
std::cout << -someZero << std::endl; // prints -0
问题是:负零有什么好处,是否应该避免使用它(即使用减法而不是在变量上加上负号)?
来自维基百科:
据称,在IEEE 754中包含有符号零使得在某些关键问题中更容易实现数值精度[1],特别是在计算复杂的初等函数时[2]。
第一个参考文献是W. Kahan的“Branch Cuts for Complex Elementary Functions or Much Ado About Nothing's Sign Bit”,可以在这里下载。
该论文中的一个例子是1/(+0)
与1/(-0)
。在这里,零的符号差异非常重要,因为第一个表达式等于+inf
,而第二个表达式等于-inf
。
x → 0−
?而且为什么在0后面还有符号? - Кое Ктоfeet = Math.signum(length) * Math.floor(Math.abs(length / 12));
// could also do feet = length>0 ? Math.floor(length / 12) : Math.ceil(length / 12)
inches = Math.abs(length) % 12;
signum(0)*floor(abs(0))
会是-0?除此之外,您可能会对“truncate”感兴趣,它类似于正数的floor和负数的ceil。如果您使用truncate(x/12)
和x/12-truncate(x/12)
,则可以保留x的符号,但获得幅值的整数除法和模余数。您还可以确定-1 < x-truncate(x) < 1
。 - John P我只能看到两个真正的用例:
在大多数情况下,这并不实用,应该避免使用。
您还可以查看此问题:是否存在负零?以及浮点数的IEEE 754规范。
负零在处理复数时有一些用处...
日常使用中,大多数情况下应避免使用负零。
以下是关于“负零”背景、用途和陷阱的一些链接: