簡體   English   中英

在 C/C++ 中快速得到 10 的 n(10^n) 次方

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM