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转换; 希望你的图书馆作者能够以一种能够提供最精确答案的方式解决如何进行转换的问题.
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)
我担心你会陷入一个受伤的世界.BigInt
由于在使用小浮点数时丢失了精度,因此无法向类中抛出非常大或非常小的浮点数.
例如,float
只有6位数的精度.因此,如果你代表10 9作为一个float
机会它将被转换回1 000 000 145
或类似的东西:没有什么保证最后的数字将是什么,它们是精确的.
当然,您可以使用更精确的表示,例如double
15位数的精度.所以通常你应该能够忠实地表示从0到10 14的整数.
最后,一些平台可能具有long long
更高精度的类型.
但无论如何,只要你的值超过可以转换回整数而没有丢失的数字位数......你就不能测试它是10的幂.
如果你真的需要这种精度,我建议不要使用浮点数.有数学库可用于BigInt
实现,或者您可以自己动手(虽然效率很难实现).
归档时间: |
|
查看次数: |
6222 次 |
最近记录: |