首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双精度- pow()

双精度- pow()
EN

Stack Overflow用户
提问于 2012-02-21 16:38:12
回答 2查看 2.2K关注 0票数 1

我要计算n^(1/k),其中nlong long2 <= k <= lg(n)是整数。

我想我可以用这个:

代码语言:javascript
复制
long long d = pow(n,1.0/k)-1;
while(power(d,k) < n)
    d++;
d--;

但在最后一步,它可能会溢出long long

如果我写以下内容,是否保证d将被整数(n,1.0/k)舍入:

代码语言:javascript
复制
long long d = long long(pow(n,1.0/k));

如果不是,那么计算floor(pow(n,1.0/k))的简单而安全的方法是什么?

EN

回答 2

Stack Overflow用户

发布于 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的大小应该根据变量的精度和您正在处理的数字的大小来确定。

票数 0
EN

Stack Overflow用户

发布于 2012-02-21 17:10:23

pow()返回一个双倍,我想这就是你错过的

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9381387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档