C言語のフロート

まず、浮動小数点数の概念

また、小数または浮動小数点実数として知られています。例えば、0.0,75.0,4.023,0.27、-937.198は、正当な小数です。

C言語では、二重精度が二重いわゆるフローティングフロート及びダブルキーワード小数、浮動小数点単精度浮動小数点と呼ばれる、長い二重長い倍精度浮動小数点数を定義するために使用されます。

(例えば、1.0と2.0との間の)任意の間隔で無限に多くの実数であり、コンピュータが間隔内のすべての浮動小数点値を表すことができません。

第二に、メモリの場合とポイント

レッツ・テストダブルとメモリを大量に消費浮動小数点データ型の3種類の長いダブルバイト浮動小数点数、。

実施例(book71.c)

/*
 * 程序名:book71.c,此程序测试float、double和long double占用内存的字节数
 * 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>

int main()
{
  printf("sizeof float is %d\n",sizeof(float));
  printf("sizeof double is %d\n",sizeof(double));
  printf("sizeof long double is %d\n",sizeof(long double));
}

業績

ここに画像を挿入説明

第三に、浮動小数点精度

標準Cは、float型は少なくとも6つの有効数字を表す必要があり、その範囲は、少なくとも10 ^ -37 ^ + ^ 37 ^ 10〜あります。

型float型と同じ範囲内の二重の最小値が、少なくとも10桁の有効数字を表現することができなければなりません。

長いダブル、倍精度型より高いを満たすためです。ただし、Cはlong double型倍精度の少なくとも同じ型を保証することができます。

我々が長い多くのint型のメモリよりによって占められるビットめまい、前節の整数、と推定される、上記の段落を読んで、それ以上保存されたデータの値と正確な範囲は、しかし、なぜ様々な山車それとても漠然としたデータを保存する方法のポイント値はありますか?、浮動小数点のストレージ・コンプレックスは、まだ彼らの特性をテストするために、いくつかのプログラムで最初に、議論されていない理由を私は説明しません。

図1に示すように、フロート試験

実施例(book73.c)

/*
 * 程序名:book73.c,此程序测试float的特征
 * 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h> 

int main()
{
  float ff2=9.9;   // 测试2位的浮点数
  printf("ff2=%f\n",ff2);
  if (ff2==9.9) printf("ff2==9.9\n");

  float ff5=99.999;   // 测试5位的浮点数
  printf("ff5=%f\n",ff5);
  if (ff5==99.999) printf("ff5==99.999\n");

  float ff6=999.999;   // 测试6位的浮点数
  printf("ff6=%f\n",ff6);
  if (ff6==999.999) printf("ff6==999.999\n");

  float ff7=9999.999;   // 测试7位的浮点数
  printf("ff7=%f\n",ff7);
  if (ff7==9999.999) printf("ff7==9999.999\n");

  float ff8=99999.999;   // 测试8位的浮点数
  printf("ff8=%f\n",ff8);
  if (ff8==99999.999) printf("ff8==99999.999\n");
}

業績

ここに画像を挿入説明

私たちはフロートの数ていることがわかります二つの特徴からプログラムを実行します。

1)浮動小数点データ型は概数で表され、正確ではない、nは誤りがない、実質的に、1である場合、誤ったビット小数点の後に、より大きな浮動小数点数、大きな誤差のビット数、8であります私が使用しています。

2)「==」二つの整数や文字が等しい比較するために、しかし、2つの浮動小数点数に等しくなるように思えることは同じではありません。

2、ダブルテスト

実施例(book74.c)

/*
 * 程序名:book74.c,此程序测试double的特征
 * 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h> 

int main()
{
  double ff2=9.9;   // 测试2位的浮点数
  printf("ff2=%lf\n",ff2);
  if (ff2==9.9) printf("ff2与9.9相等。\n");

  double ff12=999999999.99;   // 测试12位的浮点数
  printf("ff12=%lf\n",ff12);
  if (ff12==999999999.99) printf("ff12与999999999.999相等。\n");

  double ff13=9999999999.99;   // 测试13位的浮点数
  printf("ff13=%lf\n",ff13);
  if (ff13==9999999999.99) printf("ff13与9999999999.999相等。\n");

  double ff14=99999999999.99;   // 测试14位的浮点数
  printf("ff14=%lf\n",ff14);
  if (ff14==99999999999.99) printf("ff14与99999999999.999相等。\n");

  double ff15=999999999999.99;   // 测试15位的浮点数
  printf("ff15=%lf\n",ff15);
  if (ff15==999999999999.99) printf("ff15与999999999999.999相等。\n");

  double ff16=9999999999999.99;   // 测试16位的浮点数
  printf("ff16=%lf\n",ff16);
  if (ff16==9999999999999.99) printf("ff16与9999999999999.999相等。\n");

  double ff17=99999999999999.99;   // 测试17位的浮点数
  printf("ff17=%lf\n",ff17);
  if (ff17==99999999999999.99) printf("ff17与99999999999999.999相等。\n");

  double ff18=999999999999999.99;   // 测试17位的浮点数
  printf("ff18=%lf\n",ff18);
  if (ff18==999999999999999.99) printf("ff17与99999999999999.999相等。\n");
}

業績

ここに画像を挿入説明

私たちがいることを見ることができる2つの機能からプログラムを実行し、二重の数:

1〜17)、ダブルデータ型の発現数の近似値であり、それは正確ではない、nは小数点の後の誤りビットであり、より大きな浮動小数点数、大きな誤差のビット数のエラーが1である、ではない、実質的に私が使用しています。

2)「==」二重二つの値が等しい比較します。

3、テストlong double型

実施例(book75.c)

/*
 * 程序名:book75.c,此程序测试long double的特征
 * 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h> 

int main()
{
  long double ff2=9.9;   // 测试2位的浮点数
  printf("ff2=%Lf\n",ff2);
  if (ff2==9.9) printf("ff2与9.9相等。\n");

  long double ff12=999999999.99;   // 测试12位的浮点数
  printf("ff12=%Lf\n",ff12);
  if (ff12==999999999.99) printf("ff12与999999999.999相等。\n");

  long double ff13=9999999999.99;   // 测试13位的浮点数
  printf("ff13=%Lf\n",ff13);
  if (ff13==9999999999.99) printf("ff13与9999999999.999相等。\n");

  long double ff14=99999999999.99;   // 测试14位的浮点数
  printf("ff14=%Lf\n",ff14);
  if (ff14==99999999999.99) printf("ff14与99999999999.999相等。\n");

  long double ff15=999999999999.99;   // 测试15位的浮点数
  printf("ff15=%Lf\n",ff15);
  if (ff15==999999999999.99) printf("ff15与999999999999.999相等。\n");

  long double ff16=9999999999999.99;   // 测试16位的浮点数
  printf("ff16=%Lf\n",ff16);
  if (ff16==9999999999999.99) printf("ff16与9999999999999.999相等。\n");

  long double ff17=99999999999999.99;   // 测试17位的浮点数
  printf("ff17=%Lf\n",ff17);
  if (ff17==99999999999999.99) printf("ff17与99999999999999.999相等。\n");

  long double ff18=999999999999999.99;   // 测试17位的浮点数
  printf("ff18=%Lf\n",ff18);
  if (ff18==999999999999999.99) printf("ff17与99999999999999.999相等。\n");
}

業績

ここに画像を挿入説明

長いダブル、ダブル同じテスト結果。

4、試験の概要

フロートのみ有効数字を表現6-7「==」を使用することができない2つの数値が等しいかどうかを判断します。

、「==」を使用することができる二重ビットの有効数15-16を発現することができる2つの数値が等しいかどうかを判断します。

長い二重二重メモリの量が、同一の発現データの精度及びダブル倍増。

実際の開発、提案捨てられたフロートでは、あなたはそれが必要ではないという二重の、長い二重の時間を使用することができますが、長い二に改善がある場合、オペレーティング・システムとコンパイラの未来を知りません。

第四に、浮動小数点出力

%Fプレースホルダ使用浮きます。

二重のプレースホルダを使用して、LF%。試験結果は、二重入力が出力F%のF、%を使用することはできませんが、異なるコンパイラが異なる可能性があるため、使用されるが、%Fを推奨しないことができることを証明します。

長い二重プレースホルダを使用して%LfはLが大文字である、と指摘しました。

小数点以下6後のデフォルト表示によって浮動小数点出力。

浮動小数点出力、完全な出力フォーマット%のm.nlf、出力データ指定された整数と小数部分を使用して%Lfは小数ビットでnは、mビットを占めました。長さがより少ない値mよりも大きい場合は、長さがビット出力の実際の数で、mの値より大きい場合、その後、左のスペースを埋めます。

double ff=70001.538;
printf("ff=%lf=\n",ff);       // 输出结果是ff=70001.538000=
printf("ff=%.4lf=\n",ff);     // 输出结果是ff=70001.5380=
printf("ff=%11.4lf=\n",ff);   // 输出结果是ff= 70001.5380=
printf("ff=%8.4lf=\n",ff);    // 输出结果是ff=70001.5380=

五の一般的に使用されるライブラリ関数

以下では、私は二重の紹介、もはやフロートに関連する知識と長いダブル2つのデータ型を記述していません。

以下は、あなたが習得しなければならない、一般的な浮動小数点関数です。

double atof(const char *nptr);       // 把字符串nptr转换为double
double fabs(double x);                // 求双精度实数x的绝对值
double pow(double x, double y);      // 求 x 的 y 次幂(次方)
double round(double x);               // double四舍五入
double ceil(double x);                // double向上取整数
double floor(double x);               // double向下取整数
double fmod(double x,double y);      // 求x/y整除后的双精度余数
// 把双精度val分解成整数部分和小数部分,整数部分存放在ip所指的变量中,返回小数部分。
double modf(double val,double *ip);

など、正弦、対数、指数として計算機能にいくつかのデータ、めったに使われない実際の開発では、我々は、私が導入されていない、再チェックした情報に時間を使い、があります。

float型に変換する整数第六に、

実施例(book77.c)

/*
 * 程序名:book77.c,此程序测试整数与浮点数的转换。
 * 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>

int main()
{
  int ii=3;
  int jj=4;
  double dd;

  dd=ii;        // 可以
  printf("dd is %.2lf\n",dd);

  dd=ii/jj;     // 不行
  printf("dd is %.2lf\n",dd);

  dd=(double)ii/jj;  // 可以
  printf("dd is %.2lf\n",dd);
}

業績

ここに画像を挿入説明

特に注目すべきなのではないことを確認浮動小数点整数に変換場合ので、プラス(ダブル)キャストは良いアイデアで、少しは驚いて、DD = II / JJのコード行、DD値が0ではない0.75です。より詳細に、「C言語データ型変換」のデータ型の変換、。

七、アプリケーションの経験

例えば、2つの浮動小数点精度の問題が等しくないと、実際の開発では、我々は多くの場合、代わりに、浮動小数点の整数を使用するいくつかのピットフロート、整数は、正確かつ効率的なようです。

たとえば、人の高さ7メートル五のために、整数とメートル、浮動小数点数で1.75メートル、センチメートルであれば、175です。

長い値整数-9223372036854775808ある - 9223372036854775807有効数は19であり、そして有効ビット15-16の二重数は、従って、発現させることができる10進数の大きな数、より実用的な、より少ないトラブルでした。

マネー:1.75元、0.01元ユニットは、ユニットが1750年であるとして、あなたはどのように行うために、より小数を言いたい場合は、0.001元を使用して、175であれば?あなたこれは行き止まりです。

コード農業の道は:高レベルのプログラマが簡単にしない、最良の方法は、ピットの近くに来ることはありませんが、それは容易ではない。なお、ピットに分類されません。

八、科学表記法

実際の開発では、我々はほとんど科学的表記法を使用していないが、それは多くの場合、このようなメモリに保存された浮動小数点数として、コンピュータシステムに表示されます、我々はまだ、科学的表記法を学ぶ必要があるので、道科学表記法です。

科学表記法は、カウントする方法です。数として表され、10 ^ N ^乗算形(1≤| | <10、nは整数である)、この表記は、科学的表記法と呼ばれます。私たちは、科学的表記法の排除を使用するときに書いたり、大きくしたり小さく桁以上の操作したい場合はスペースと多くの時間を無駄に。

例えば:51400000000 = 5.14×10 ^ 11 ^、コンピュータ10の電源は、一般式がEまたはE、51400000000 = 5.14E11又は5.14e11すなわちです。

数がシンボルの数を変更せずに、科学的表記法を用いて表現すると、ちょうど簡単に日常生活で遭遇したいくつかの極端に大きい、または小さい数を表すことができ、唯一の書面の数を変更します。例えば:光の速度/秒300,000,000約メートルである。世界の人口が約ある:61億、ディスプレイは非常に不便であり、書き込みの数は、それほど形式として表現される重複0を排除書き込みになります。 61億= 6.1×10 ^ 9 ^、即ち6.1E9又は6.1e9。

0.00001 = 1×10 ^ -5 ^、絶対値が1よりも小さい、すなわち数はまた、科学的表記法で表現することができる乗算器10 ^ -n ^形態です。すなわち、1E-5または1E-5。

科学的表記法%電子の%Eまたは出力を使用して、出力フォーマットが完了したか、%m.ne%m.nEは、出力データを指定された整数と小数部分は小数ビットでnは、mビットを占めました。長さがより少ない値mよりも大きい場合は、長さがビット出力の実際の数で、mの値より大きい場合、その後、左のスペースを埋めます。

実施例(book78.c)

/*
 * 程序名:book78.c,此程序测试浮点数据的科学计数法。
 * 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>

int main()
{
  double dd;

  dd=123000000;
  printf("dd is  %.2e\n",dd);

  dd=-123000000;
  printf("dd is %.2e\n",dd);

  dd=0.0000000123;
  printf("dd is  %.2e\n",dd);

  dd=-0.0000000123;
  printf("dd is %.2e\n",dd);
}

業績

ここに画像を挿入説明

ナイン、宿題

1)このセクションbook71.c、book73.c、book74.c、book75.c、book77.c、book78.c、コンパイルに似たサンプルプログラムを記述し、それを実行し、プログラマの書き込み、外を見るためにではありません練習は、あなたが毎日支払わなければならないことを意味し、完璧になります。

2)範囲を超えるサンプルプログラム、テスト浮動小数点割り当て結果の調製。

3)メモリ・ストレージにおけるフロートの上に、あなたが、(C浮動小数点のストレージでキーワード検索)百度に関連する概念を見て見に行くことをお勧めします。

4)サンプルプログラムの調製、浮動小数点数の試験結果を整数変数に割り当てられ、その理由について考えています。

クロス知識があるので5)、表題の作業は、次のように、その機能を達成するための関数宣言を一般的に使用される浮動小数点ライブラリ関数を書き換えるために、「C言語のデータ型変換」を学んだ後、推奨して、それを行うされています。

double FABS(const double x);          // 求双精度实数x的绝对值
double ROUND(const double x);         // double四舍五入
double CEIL(const double x);          // double向上取整数
double FLOOR(const double x);         // double向下取整数
// 把双精度val分解成整数部分和小数部分,整数部分存放在ip所指的变量中,返回小数部分。
double MODF(double val,double *ip);  

テン、著作権

C言語Technology Networkのオリジナルの記事、論文、著者と元にソースリンクを明記してくださいを再現。
出典:C言語テクノロジーネットワーク(www.freecplus.net)
著者:倫理コード農業

記事の誤字、またはコンテンツのエラー、またはその他の提案やコメントは、正しい私にメッセージをお願いした場合、どうもありがとうございました!

おすすめ

転載: www.cnblogs.com/wucongzhou/p/12498838.html