我需要將浮點數轉換爲以下非標準格式: 「一個浮點數F(採用標準十進制指數格式),後跟字符串 乘以10,power, 後跟一個整數K.」將浮點數轉換爲C(非標準格式)中的科學記數法?
有沒有辦法從e%或類似於frexp()函數中提取指數?
例如爲:3349.25應該是「3.34925乘以10的力量3」
我需要將浮點數轉換爲以下非標準格式: 「一個浮點數F(採用標準十進制指數格式),後跟字符串 乘以10,power, 後跟一個整數K.」將浮點數轉換爲C(非標準格式)中的科學記數法?
有沒有辦法從e%或類似於frexp()函數中提取指數?
例如爲:3349.25應該是「3.34925乘以10的力量3」
您可以實現很容易frexp自己的十進制等效值。你需要的代碼看起來是這樣的:
int exponent = (int)log10(fabs(d));
double mantissa = d/pow(10, exponent);
printf("%f X 10^%d\n", mantissa, exponent);
首先我們把你的號碼的絕對值的10爲底的對數確定指數。 (我們需要fabs
,因爲log10
需要一個積極的論點。)演員陣容朝向零,這很方便,我們需要。然後,我們通過分割來標準化尾數。
這不處理d == 0(或無窮大或NaN),該部門將在結果中引入一些錯誤,並且我沒有用小數字或負數測試它,但是這應該會給你一些東西從開始。
對於0和1之間的數字,向零舍入會給出錯誤的結果,例如, '(INT)日誌10(0.12)= 0'。樓層可能更適合 –
我喜歡OP方法,讓printf()
使用"%e"
格式來完成繁重工作。
有很多問題與double
到字符串轉換,現有的功能已經很好地處理。 (INF,Nan,-0,四捨五入,負數)。 OP的使用frexp()
,power()
通常具有接近於10的冪的四捨五入和有限精度的問題。
由於只給出了1個例子,OP的模糊程度是多少。 power(0.5, 100)
需要100位數字。讓我們把它限制在DBL_DIG,而不是使用%e
默認的6(這實在是7位,僅有6的DP之後。)
char *Heyhey_Notation(char *dest, double x) {
static const char Times[] = " times 10 to the power ";
char buffer[3 + DBL_DIG + sizeof(Times) + 20 + 1];
sprintf(buffer, "%.*e", DBL_DIG, x);
char *e = strchr(buffer, 'e'); // find exponent position
if (e) {
char *zero = e;
while (zero[-1] == '0') zero--;
*zero = '\0'; // OP wants excess zeros trimmed.
int power = atoi(&e[1]); // trim excess zeros by converting to int
sprintf(dest, "%s%s%d", buffer, Times, power);
}
else {
strcpy(dest, buffer);
}
return dest;
}
int main() {
char buf[100];
puts(Heyhey_Notation(buf, 3349.25));
puts(Heyhey_Notation(buf, -0.0));
puts(Heyhey_Notation(buf, 123));
puts(Heyhey_Notation(buf, -1234567890.0/9999999999.0));
puts(Heyhey_Notation(buf, -1/0.0));
puts(Heyhey_Notation(buf, atof("nan")));
return 0;
}
3.34925 times 10 to the power 3
-0. times 10 to the power 0
1.23 times 10 to the power 2
-1.23456789times 10 to the power -1
-inf
nan
感謝您提供詳細信息,但我只需要以不同的格式編寫浮動內容,而來自pburka的回答很好。 – redundant6939
@Heyhey Heyhey認爲你想要「3.34925 X 10^3」作爲_posted_而不是「3.349250 X 10^3」。除了0.0的麻煩,用| input | <1.0另一種方法給出了0的前導數字。很高興另一種解決方案適合您 - 感謝您的贊成票, – chux
提供什麼樣的是缺乏一個更好的計劃爲例 – SKJ
您預期的輸出,我可能''snprintf''float'使用'%e',然後簡單地使用你從中得到的字符串。這不是非常漂亮,但它會起作用。 – us2012
一般說明:'10'的科學記數法指數將是原始數字的基數10的整數部分。那麼科學記數法「尾數」將是原來的數字除以10。您可以使用'%f'打印該部分。 – lurker