C++:如何测试一个数是10的幂?

Gio*_*hal 18 c++ math floating-point

我想测试一个数字double x是10的整数幂.我可以使用cmath log10然后测试是否x == (int) x

编辑:实际上,我的解决方案不起作用,因为双精度可以非常大,比int大得多,也非常小,如分数.

Pau*_*ley 23

查找表将是迄今为止最快,最精确的方法; 只有大约600个10的幂可以表示为双打.您可以使用哈希表,或者如果表从最小到最大排序,您可以使用二进制切换快速搜索它.

这样做的好处是,当且仅当您的数字恰好是最接近的IEEE双倍到10的某个幂时,您将获得"命中".如果这不是您想要的,您需要更准确地了解您的确切方式希望你的解决方案能够处理这样一个事实:许多10的幂不能完全表示为双精度.

构造表的最佳方法可能是使用string - > float转换; 希望你的图书馆作者能够以一种能够提供最精确答案的方式解决如何进行转换的问题.

  • 由于Helltone只寻找完全匹配,这将是16个可能的匹配,而不是600.更多的是仅仅检查这些常量的参数. (3认同)
  • @Stephen Canon:你怎么得到19?假设IEEE 754 binary64加倍,我将其设为23.(10 ^ 0到10 ^ 22都是完全可以表示的,但是10 ^ 23不是,正好落在两个可表示的双精度之间.) (2认同)

And*_*nck 10

您的解决方案听起来不错,但我会用公差替换完全比较.

double exponent = log10(value);
double rounded = floor(exponent + 0.5);
if (fabs(exponent - rounded) < some_tolerance) {
    //Power of ten
}
Run Code Online (Sandbox Code Playgroud)


Mat*_* M. 5

我担心你会陷入一个受伤的世界.BigInt由于在使用小浮点数时丢失了精度,因此无法向类中抛出非常大或非常小的浮点数.

例如,float只有6位数的精度.因此,如果你代表10 9作为一个float机会它将被转换回1 000 000 145或类似的东西:没有什么保证最后的数字将是什么,它们是精确的.

当然,您可以使用更精确的表示,例如double15位数的精度.所以通常你应该能够忠实地表示从0到10 14的整数.

最后,一些平台可能具有long long更高精度的类型.

但无论如何,只要你的值超过可以转换回整数而没有丢失的数字位数......你就不能测试它是10的幂.

如果你真的需要这种精度,我建议不要使用浮点数.有数学库可用于BigInt实现,或者您可以自己动手(虽然效率很难实现).