我要计算n^(1/k),其中n是long long,2 <= k <= lg(n)是整数。
我想我可以用这个:
long long d = pow(n,1.0/k)-1;
while(power(d,k) < n)
d++;
d--;但在最后一步,它可能会溢出long long。
如果我写以下内容,是否保证d将被整数(n,1.0/k)舍入:
long long d = long long(pow(n,1.0/k));如果不是,那么计算floor(pow(n,1.0/k))的简单而安全的方法是什么?
发布于 2012-02-21 17:21:07
你是在要求保证。不幸的是,对于C/C++中的类型,几乎没有什么保证。没有为这些数据类型定义确切的大小,尽管您会发现long long通常是64位。但是,我相信1.0在默认情况下将是一个float,它通常有32位。有float pow(float base, float exponent)和double pow(double base, double exponent),我不确定C++是否会理解您想要使用哪一个,除非您指定了它。因此,在转换时可能会丢失精度。哦,顺便说一句,即使是double,也可能不像long long那样精确,因为它也存储指数。
另一个问题是,即使你认为浮点转换不正确,它也可能不精确。我曾经从stdin将整数读入浮点变量,然后立即将其转换回int,发现整数从一个整数值舍入到下面的一个整数值。为了避免这种情况,您应该在类型广播之前添加一个小epsilon。epsilon的大小应该根据变量的精度和您正在处理的数字的大小来确定。
发布于 2012-02-21 17:10:23
pow()返回一个双倍,我想这就是你错过的
https://stackoverflow.com/questions/9381387
复制相似问题