[英]FAST get 10 to the power n(10^n) in C/C++
好吧,感謝您點擊。我想快速計算 10(是的,只有 10)的 n[0..308] 次方。 我想出了一些方法。
1)
double f(int n) {
return pow(10.0, n);
}
double f1(int n) {
double a = 10.0;
double res = 1.0;
while(n) {
if(n&1) res *= a;
a *= a;
n >>= 1;
}
return res;
}
時間:O(logn),可以更快嗎? ( // f1() 可以做一些優化,但仍然是 O(logn))
2)
double f2(int n) {
static const double e[] = { 1e+0, 1e+1, 1e+2, ..., 1e+308 };
return e[n];
}
時間:O(1),非常好。 但是空間:309 * 8 字節 = 2472 字節..哎呀它太大了......
3)
double f3(int n){
static const double e[] = {
1e+1, 1e+2, 1e+4, 1e+8, 1e+16, 1e+32, 1e+64, 1e+128, 1e+256
};
double res = 1.0;
for(int i = 0; n; ++i){
if(n & 1){
res *= e[i];
}
n >>= 1;
}
return res;
}
f3 結合了 f1 和 f2 以避免乘法,例如 1e128*1e128,我希望它更快,但是.. 實際上 f3 比 f2 慢.. 因為 ++ii 猜測..
好吧,在我輸入這些代碼之前我幾乎放棄了,
int main(){
double d = 1e+2;
return 0;
}
並通過 g++ 將其編譯為 .s
LCPI0_0:
.quad 0x4059000000000000 ## double 100
編譯器如何知道 1e+2 是 0x4059000000000000?
我的意思是我想要得到的只是一個雙值 1e+n。 但是當編譯器編譯“double d = 1e+2”時,它知道 d 應該是 0x4059000000000000。 我可以使用某種方法直接返回像 1e+n. 或者我可以做一些 C/C++ 以外的事情來獲得我的價值嗎?
多謝。 如果有什么不對或不清楚的地方,請指出。
你試過std::pow(std::valarray)嗎? 🤔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.