这段代码:
System.out.println(Math.abs(Integer.MIN_VALUE));
Run Code Online (Sandbox Code Playgroud)
返回 -2147483648
它不应该返回绝对值2147483648吗?
这是如何运作的?
这个想法是abs(x)对整数使用按位运算符(假设为 32 位字):
y = x >> 31
(x + y) ^ y // This gives abs(x) (is ^ XOR)?
Run Code Online (Sandbox Code Playgroud) Numpy提供了两者np.absolute和np.abs通过定义的别名
from .numeric import absolute as abs
Run Code Online (Sandbox Code Playgroud)
这似乎明显违反了蟒蛇的禅宗:
应该有一个 - 最好只有一个 - 明显的方法来做到这一点.
所以我猜这有充分的理由.
我个人一直在使用np.abs几乎所有的代码,并查看例如np.abs与np.absolute在Stack Overflow上的搜索结果数量,似乎绝大多数都是这样(2130 vs 244次点击).
没有任何理由,我应该优先使用np.absolute过np.abs在我的代码,或者我应该简单地去为更多的"标准" np.abs?
在C/C++中,为什么要使用abs()或fabs()找到变量的绝对值而不使用以下代码?
int absoluteValue = value < 0 ? -value : value;
Run Code Online (Sandbox Code Playgroud)
是否与较低级别的较少指令有关?
哪个是实现返回数字绝对值的操作的最快方法?
x=root(x²)
Run Code Online (Sandbox Code Playgroud)
要么
if !isPositive(x):
x=x*(-1)
Run Code Online (Sandbox Code Playgroud)
实际上这个问题可以翻译为,有多快if(为什么请).
我的大学程序教授总是告诉我要避免使用ifs,因为它们非常慢,但我总是忘记问多慢和为什么.这里有人知道吗?
是否std::abs()为C++ 11中的所有算术类型定义了函数,并且返回|x|时没有近似问题?
一个奇怪的是,与G ++ 4.7, ,std::abs(char),,std::abs(short int) 和似乎回到了双(对相反:http://en.cppreference.com/w/cpp/numeric/math/abs).如果数字被转换为double,我们可能会对非常大的数字(例如)有一些近似误差.std::abs(int)std::abs(long int)std::abs(long long int)-9223372036854775806LL = 2^63-3
那么我是否std::abs(x)总能|x|为所有算术类型返回保证?
编辑:这是一个进行一些测试的示例程序
#include <iostream>
#include <iomanip>
#include <cmath>
#include <typeinfo>
template<typename T>
void abstest(T x)
{
static const unsigned int width = 16;
const T val = x;
if (sizeof(val) == 1) {
std::cout<<std::setw(width)<<static_cast<int>(val)<<" ";
std::cout<<std::setw(width)<<static_cast<int>(std::abs(val))<<" ";
} else {
std::cout<<std::setw(width)<<val<<" ";
std::cout<<std::setw(width)<<static_cast<T>(std::abs(val))<<" ";
}
std::cout<<std::setw(width)<<sizeof(val)<<" ";
std::cout<<std::setw(width)<<sizeof(std::abs(val))<<" ";
std::cout<<std::setw(width)<<typeid(val).name()<<" …Run Code Online (Sandbox Code Playgroud) 我在abs()和fabs()函数上运行了一些简单的测试,我不明白使用fabs()的优点是什么,如果是:
1)慢一点
2)仅适用于花车
3)如果在不同类型上使用,将抛出异常
In [1]: %timeit abs(5)
10000000 loops, best of 3: 86.5 ns per loop
In [3]: %timeit fabs(5)
10000000 loops, best of 3: 115 ns per loop
In [4]: %timeit abs(-5)
10000000 loops, best of 3: 88.3 ns per loop
In [5]: %timeit fabs(-5)
10000000 loops, best of 3: 114 ns per loop
In [6]: %timeit abs(5.0)
10000000 loops, best of 3: 92.5 ns per loop
In [7]: %timeit fabs(5.0)
10000000 loops, best of 3: 93.2 ns …Run Code Online (Sandbox Code Playgroud) 有没有办法在不使用java中的Math.abs()方法的情况下找到数字的绝对值.
考虑以下程序(C99):
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
int main(void)
{
printf("Enter int in range %jd .. %jd:\n > ", INTMAX_MIN, INTMAX_MAX);
intmax_t i;
if (scanf("%jd", &i) == 1)
printf("Result: |%jd| = %jd\n", i, imaxabs(i));
}
Run Code Online (Sandbox Code Playgroud)
现在据我了解,这包含易于触发的未定义行为,如下所示:
Enter int in range -9223372036854775808 .. 9223372036854775807:
> -9223372036854775808
Result: |-9223372036854775808| = -9223372036854775808
Run Code Online (Sandbox Code Playgroud)
问题:
这真的是不确定的行为,如"代码可以触发任何代码路径,其中的任何代码,中风编译器的花哨",当用户输入的差多少,?还是其他一些没有完全定义的味道?
一个迂腐的程序员如何防止这种情况,而不做任何标准无法保证的假设?
(有一些相关的问题,但我没有找到一个回答上面的问题2,所以如果你建议重复,请确保它回答.)