簡體   English   中英

C是否必須用科學計數法計算出一個數字?

[英]Does C have to calculate out a number in scientific notation?

浮點數的最大值是3.40282347E + 38。 這相當於3.40282347 * 10 ^ 38。 我想知道我是否設置了一個與此相等的浮點數,它是否必須實際執行冪和乘法才能得到存儲的值,或者科學記數法只是實際值?

我正在編寫一個我們正在優化的學校項目,所以這對我來說很重要,特別是因為它在嵌套的循環結構中。

當您在源代碼中使用文字時,這些文字(以及主要用於常量折疊的所有文字的表達式)在編譯時進行評估,並轉換為move immediate add immediatemove special_constant_register等指令。

例如:

int a = 10, b = 0xA;

這里, 100xA文字在編譯時被計算為相同的值。 在您的情況下,也會在編譯時評估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.

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