[英]Does C have to calculate out a number in scientific notation?
浮點數的最大值是3.40282347E + 38。 這相當於3.40282347 * 10 ^ 38。 我想知道我是否設置了一個與此相等的浮點數,它是否必須實際執行冪和乘法才能得到存儲的值,或者科學記數法只是實際值?
我正在編寫一個我們正在優化的學校項目,所以這對我來說很重要,特別是因為它在嵌套的循環結構中。
當您在源代碼中使用文字時,這些文字(以及主要用於常量折疊的所有文字的表達式)在編譯時進行評估,並轉換為move immediate
add immediate
, move special_constant_register
等指令。
例如:
int a = 10, b = 0xA;
這里, 10
和0xA
文字在編譯時被計算為相同的值。 在您的情況下,也會在編譯時評估double
literal或float
literal,並為該變量分配最合適的值。
當你編寫3.4e38
,它會在編譯時完全評估。
當你寫3.4 * 10^38
,你會得到一個完全出乎意料的結果。 這是因為^
並不意味着C中的冪。它意味着“異或”,並且10 ^ 38 == 44
。 或者它可能根本不編譯,因為它被評估為(3.4 * 10) ^ 38
,並且沒有為浮點定義xor。 或者它被定義,所以它將是340 ^ 10
。
這一切都是在編譯時完成的。 以下代碼......
#include <float.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
float foo = 3.40282347E+38;
float bar = 3.40282347e38;
printf("foo=%g\nbar=%g\n", foo, bar);
return 0;
}
在匯編程序中生成它。 為了讓匯編程序使用-S
標志來表示gcc,例如
gcc -S -Wall -O3 -pedantic -std=c11 scientific_notation.c
這是使用clang。 我會稍微剪掉匯編程序......
.section __TEXT,__text,regular,pure_instructions
.macosx_version_min 10, 11
.section __TEXT,__literal8,8byte_literals
.align 3
LCPI0_0:
.quad 5183643170566569984 ## double 3.4028234663852886E+38
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
...剪斷。
請注意這一行.quad 5183643170566569984
。 這是一個常數。 另請注意,即使我的代碼中有兩個這樣的常量,編譯器也只需要一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.