C言語関数:ldexp





C言語のページでは、次の内容を解説しております。
C言語の入門講座  C言語の文法を中心に、基本的な関数などの解説をしています。
C言語ケーススタディ  C言語での実践的なプログラミングについて解説をしています。
C言語の関数リファレンス  C言語で用意されている関数を解説しています。
C言語で3次元動画プログラム  C言語で3次元タートルグラフィックを使用した3次元の動画プログラムの作成例です。
C言語の検定試験  C言語の文法に関する検定試験を実施することができます。
C言語でゲーム作成  C言語を使用したゲームの作り方を解説したページも用意しております。



2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を協力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。




■ldexp
2のn乗

【分類】
数学関数

【書式】
double ldexp(double x, int n);

【パラメータの型と説明】

パラメータ説明
double x
int n

【機能説明】
x×2のn乗の値を返します。計算結果が大きすぎてdouble型の範囲を越えるときは、エラーとなりプログラムが終了します。

Study Cを使用している場合は、下記のようにコマンドラインから実行(exprコマンドを使用)して動作を確認することができます。

C:StudyC\MyProg>expr ldexp(1, 2)
コマンド入力行: WARNING(1206) 関数パラメータの型が一致していません. 'ldexp'
<double>4

C:StudyC\MyProg>expr ldexp(12.3, 3)
<double>98.4

C:StudyC\MyProg>expr ldexp(12.3, 5)
<double>393.6

C:StudyC\MyProg>expr ldexp(12.3, 10000)
コマンド入力行: WARNING(3203) 浮動小数点演算でオーバーフローが発生しました.
<double>1.79769e+308

1番目の例では引数が「1」と整数型のためWARNINGが表示されています。 また、最後は結果が大きすぎてオーバーフローとなっています。

通常のコンパイラを使用する場合の使用例は下記になります(もちろんStudy CでもOKです)。

#include <stdio.h>

main()
{
        printf("%g\n", ldexp(12.3, 3));
        printf("%g\n", ldexp(12.3, 5));
        printf("%g\n", ldexp(12.3, 10000));
}

実行結果は以下になります。

98.4
393.6
ファイル名未定義 [1]: 7: WARNING(3203) 浮動小数点演算でオーバーフローが発生しました.
1.79769e+308

次のプログラムは、Study Cのサンプルプログラムのldexp.cです。 プログラムを実行するとldexp()関数のグラフを描画します。

#include <graph.h>

main()
{
        int     t;
        int     x, y;
        int     start = -20;
        double  s = 2;
        int     lx, ly;

        gl_openwin(-1, -1, 640, 400, 1);
        gl_line(0, 200, 639, 200, 1, 0, RGB(0, 255, 0));
        gl_line(320, 0, 320, 400, 1, 0, RGB(0, 255, 0));

        lx = ly = 0;
        for(t = start; t < 100; t += 1){
                x = t * 20 + 320;
                y = -ldexp(s, t) + 200;
                if(t == start){
                        gl_setpixel(x, y, RGB(255, 255, 255));
                }
                else{
                        gl_line(lx, ly, x, y, 1, 0, RGB(255, 255, 255));
                }
                lx = x;
                ly = y;
                if(ly < 0)
                        break;
        }
}

このサンプルプログラムを実行すると次のようなグラフが表示されます。
ldexp関数のグラフ

【参照関数】
frexp
pow