2013-10-29 31 views
0

我試圖採用表達式的第11個根,並得到-inf的返回。以超過2的根爲基礎

std::cout << pow(j,(1.0/11.0)) << std::endl; 

其中j只是一些log表達式。我已檢查過該號碼以確保它是有效的,而且是。我認爲這是權力表達式運行的方式。有一個更好的方法嗎?謝謝。

是的,我已將cmath納入我的工作。

+2

完全可編譯的源代碼可以提供幫助。還使用輸入值? ps:http:// ideone。com –

+0

你也可以使用exp():double _11th_root = exp(log(j)/11.0); –

+0

請注意,生根會降低你的精確度,就像災難性的取消一樣,例如,在平方根之後你將精度減半,我不知道第11根會有多精確,但它不會許多。 – Cramer

回答

1

我不能想到pow返回-inf的正當理由,如果你的輸入是邊緣理性的。但是如果你正在傳遞一個負數,一些可能是值得嘗試的是:

if(j==0) return 0; 
if(j<0) return -pow(-j, 1.0/11.0); 
return pow(j,1.0/11.0); 
1
  1. 嘗試尋找FPU錯誤

    • 最常見的是被遺忘的浮動收益/ double在某些函數中
    • 這導致FPU堆棧上的問題非常小。
  2. 也可以嘗試戰俘之前添加此

    asm { fninit; }; 
    
    • 這個重置FPU,所以如果你有棧的問題,將有助於
    • ,但當然不會在中間做一些FPU計算
    • 它會破壞它的結果
    • 如果你不在x87平臺上比這不會幫助
  3. 碰撞前j的價值將是一個很好的開始與我們分享。

  4. 嘗試的結果存儲戰俘的一些浮點/雙精度變量

    • COUT變量不是暫時的堆內存位置
    • 是否打印-inf也期待這個變量裏面,如果它也是 - INF
    • (可能是有點問題COUT不是戰俘......)
  5. 儘量減少你的代碼(由部分關閉一切一部分)

    • ,看看問題是不是突然出現
    • 隱藏內存泄漏和代碼重寫是邪惡...

讓我們知道你有什麼發現。