2016-04-12 9 views
3

浮動小数点の最大値は3.40282347E + 38です。これは、3.40282347 * 10^38に相当します。私は浮動小数点をこれに等しく設定すれば、それを実際に蓄える値を得るために力と乗算を行わなければならないのか、それとも単に科学的表記であるのだろうか?Cは科学的表記法で数値を計算しなければなりませんか?

私は可能な限り最適化している学校プロジェクトを書いていますので、特にネストされたループ構造内にあるので、これは私にとって重要です。

+1

このようなリテラル定数は、実行時ではなくコンパイル時に評価されます。また、ハードコードされた定数ではなく、 'FLT_MAX'を使用してください。 –

+0

大丈夫、知っておきたいこと。私はfloat.hヘッダーを含めることはできませんので、私はFLT_MAXを使用することはできません – FLOWMEEN

+0

これはまた役立つかもしれません:http://stackoverflow.com/questions/3271588/representation-of-float-in-c – RhinoDevel

答えて

1

あなたがソースコード内のリテラル、それらのリテラル(および一定の折りたたみのためのすべてのリテラルを含むほとんどの式)を使用すると、コンパイル時に評価され、move immediateなどの指示に変換し、add immediateされ、など

EXの場合:

int a = 10, b = 0xA; 

ここ両方100xAリテラルは、コンパイル時に同じ値に評価されます。あなたの場合にも、doubleリテラルまたはfloatリテラルがコンパイル時に評価され、最も適切な値が変数に割り当てられます。

1

3.4e38と記述すると、コンパイル時に完全に評価されます。

3.4 * 10^38と書くと、まったく予期しない結果になります。これは、^がCでのべき乗を意味しないからです。これは "排他的論理和"を意味し、10^38 == 44を意味します。あるいは、(3.4 * 10)^38と評価され、浮動小数点に対してxorが定義されていないため、まったくコンパイルされないことがあります。または定義されているので、340^10になります。

+0

ありがとう、それはちょうど擬似コードでした。私は意味した3.40282347 * pow(10、38) – FLOWMEEN

1

コンパイル時にすべて完了しました。次のコード...

#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; 
} 

これをアセンブラで生成します。アセンブラを取得するにはgccすなわち、これは打ち鳴らすを使用している

gcc -S -Wall -O3 -pedantic -std=c11 scientific_notation.c 

のようなものに-Sフラグを使用します。私はアセンブラをちょっと切り捨てます。

.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。それは定数です。また、私は自分のコードでこれらの定数のうちの2つを持っているにもかかわらず、1つだけがコンパイラによって必要とされることに注意してください。

関連する問題