👇のエピソードのように古い統合開発環境EAZY IDECが精度で最新の統合開発環境Visual Studioを上回ることがあります

☆変数の型 float型 double型の変数は大変小さな数値を格納することができますが %f出力変換指定子の働きにより小数点以下6桁までしかコマンドプロンプト画面にprintf出力表示されません


☆変数の型 float型 double型の変数は大変小さな数値を格納することができますが %f出力変換指定子の働きにより小数点以下6桁までしかコマンドプロンプト画面にprintf出力表示されません





ソーラー 「で、今の説明では、


実数の型

float

を使って


float a;

のように

変数宣言される


float型の変数aは


-3.4×(10の38乗)から- 3.4×(10の-38乗)までの実数値


0


3.4×(10の-38乗)から3.4×(10の38乗)までの実数値を格納できます


実数の型

double

を使って


double a;のように

変数宣言される


double型の変数aは  


-1.7×(10の308乗)から-1.7×(10の-308乗)までの実数値


0


1.7×(10の-308乗)から1.7×(10の308乗)までの実数値



を格納できます


と、記述されています。


ということは


変数aに格納される実数値が


3.4×(10の-38乗)から3.4×(10の38乗)の


範囲内なら


float

double

が変数aの型としてつかえ


変数aに格納される実数値が


3.4×(10の-38乗)から3.4×(10の38乗)の範囲内を越えて


1.7×(10の-308乗)から1.7×(10の308乗)の範囲内に


おさまるなら


double


が変数aの型としてつかえるということになるんだね。


が・・・」


むーっと画面をみつめる。


ぐっじょぶC 「気づいたかな、ソーラー。ははは・・・」


ソーラー「float型の変数aの格納できる数値の範囲が 


3.4×(10の-38乗)から3.4×(10の38乗)って・・


0.000000000000000000000000000000000000034


(小数点以下39桁)


から


340000000000000000000000000000000000000


(39桁の桁数です。)


までの数値を格納できるってことだよね・・・」


ぐっじょぶC


「そうなんだよ・・・。は、ははは・・・・・」


ソーラー 「確か


%f出力変換指定子をつかって


実数値をコマンドプロンプト画面にprintf出力表示させた場合


小数点以下6桁までしか出力表示できなかったような・・・」


ぐっじょぶC 「そこなんだよ。ソーラー。


ぼくの ぐっじょぶCのサイトでは


ウェールカム 

float double型の変数にどんどん実数値をいれて~って



float型の変数は 3.4×(10の-38乗)から3.4×(10の38乗)

double型の変数は 1.7×(10の-308乗)から1.7×(10の308乗)


こんなにおおきな実数値が格納できますのよ~(笑)って


まあ。僕のサイトには


こんなふうに表記してあるけど・・


コマンドプロンプト画面へのprintf出力表示の方がね


小数点以下6桁までしか表示できないんだよ。」


ソーラー 「これは つまり


float型の変数aには  3.4×(10の-38乗)から3.4×(10の38乗)までの実数値

double型の変数aには 1.7×(10の-308乗)から1.7×(10の308乗)までの実数値



    🍓コンピュータのメモリに格納できてはいる🍓




実際にコマンドプロンプト画面にprintf出力表示できるのは小数点以下6位までで


それ未満の位の数値は


コマンドプロンプト画面にprintf出力表示されないことを


あらわしています。

(その際小数点以下7位が四捨五入されています)


小数点以下6桁までしか

コマンドプロンプト画面にprintf出力表示できないからといって


その数値が 変数に、つまり コンピュータ内のメモリ


に小数点以下6桁までしか


格納されないということではないんだね。」


🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊

それに対し


実数値の整数部分は小数点以下6桁までしか表示されないと


いうような制限はありませんが


ただしくprintf出力表示されない場合があります。


実数値 280534750606047745855112312345678.123456を


例にとってみます。


この例でいうと


整数値の部分は280534750606047745855112312345678ですね。


実数値 280534750606047745855112312345678.123456は


floatやdouble型の変数aが格納できる範囲内の数値ですが 


次のプログラムの実行結果をみていただければ


お分かりになられますように正確にprintf出力表示できません。


#include <stdio.h>


int main(void)

{

float a;

a = 280534750606047745855112312345678.123456;


printf("%f\n", 10000 * a);


return 0;

}


プログラムの実行結果(EAZY IDECの場合)


2805347568335614200000000000000000000.000000




プログラムの実行結果(Visual Studio2018の場合)


C4305 '=': 'double' から 'float' へ切り詰めます。 Project6 c:\users\solarplexuss\source\repos\project6\project6\source.cpp 6



と表示されますが


プログラムを実行すると


2805347540172478284164847597890043904.000000


と表示されます。



プログラムの実行結果(Visual Studio2019の場合)



重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態

警告 C26451 演算のオーバーフロー: 4 バイトの値に演算子 '*' を使用し、結果を 8 バイトの値にキャストしています。オーバーフローを避けるため、演算子 '*' を呼び出す前に値を幅の広い型にキャストしてください (io.2)。 Project2 C:\Users\solar\source\repos\Project2\Project2\program1.cpp 8


と表示されますが


プログラムを実行すると


2805347540172478284164847597890043904.000000


と表示されます。


C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 1566640) は、コード 0 で終了しました。

このウィンドウを閉じるには、任意のキーを押してください...







EAZY IDECの場合

2805347568335614200000000000000000000.000000


Visual Studioの場合

2805347540172478284164847597890043904.000000


となり正確に

28053475060604774585511231234567812345.600000


をprintf出力表示できていません。


というか

EAZY IDECの場合も

Visual Studioの場合も

もっと大きな値をprintf出力表示しています。


🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊


ソーラー「


float型の変数a

double型の変数a

数値を格納できる範囲


float型の変数a  3.4×(10の-38乗)から3.4×(10の38乗)までの実数値

double型の変数a 1.7×(10の-308乗)から1.7×(10の308乗)までの実数値


に比べて


あまりにもprintf出力表示できる小数点以下の桁数が少ない・・・・


小数点以下6桁までだよ 


%f出力変換指定子をつかってprintf出力表示できるのは・・・」


ぐっじょぶC 「うぷぷっ」


うなづく、ぐっじょぶC 


なんだか楽しそうである。


ソーラー 「だって


変数の型 double



1.7×(10の-308乗)から1.7×(10の308乗)までの実数値を

格納できます。



の1.7×(10の-308乗)から1.7×(10の308乗)って


1.7×(10の-308乗)は


0.00000000000000000000000000000000000000000000000000


000000000000000000000000000000000000000000000000000


000000000000000000000000000000000000000000000000000


000000000000000000000000000000000000000000000000000


000000000000000000000000000000000000000000000000000


000000000000000000000000000000000000000000000000000


0000000017 (小数点以下310桁)だよ?。


1.7×(10の308乗)は


17000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


000000000(309桁)?だよ。


めちゃくちゃたくさん桁数のある数値を


double型の変数を使って


コンピュータのメモリに格納できることになるね。


それに対し


%f出力変換指定子をつかってprintf出力表示できる


小数点以下の実数値の桁数は6桁まで。


本当に~~~~~?


そこで本当にprintf出力表示できる


実数の桁数は小数点以下6桁まで、か


1.7654322

8.9876654

98.777888


などなどを


実際に プログラムを構成して


%f出力変換指定子をつかってprintf出力表示して確かめてみます。


#include <stdio.h>


int main(void)

{

printf("%f\n",1.7654322);

printf("%f\n",8.9876654);

printf("%f\n",98.777888);


return 0;

}


ソーラー 「そ~れ~、コンパイル。」


プログラムの実行結果


1.765432

8.987665

98.777888

続行するには何かキーを押してください・・・_


ソーラー 「実数を%f出力変換指定子をつかって


コマンドプロンプト画面に


printf出力表示した場合


小数点以下6位までしかprintf出力表示されないので


1.7654322

8.9876654


は一番下の小数点以下7位の数値が四捨五入されて


1.765432

8.987665


が表示されることになります


そこで再び・・・


実際にプログラムを構成して


変数の型doubleの範囲内にぎりぎりおさまる


1.8×(10の-308乗)=


0.00000000000000000000000000000000000000000000000000


000000000000000000000000000000000000000000000000000


000000000000000000000000000000000000000000000000000


000000000000000000000000000000000000000000000000000


000000000000000000000000000000000000000000000000000


000000000000000000000000000000000000000000000000000


0000000018 (小数点もふくめて311桁)と


1.6×(10の308乗)=


16000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


000000000(309桁)


この2つを


%f出力変換指定子をつかってprintf出力表示してみましょう。


このとき


変数の型doubleは実数を収める型ですので


16000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


000000000は


16000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


000000000.000と


一応、小数点以下の項.000をつけて実数にしてから


%f出力変換指定子をつかってprintf出力表示してみるとしよう。


/*小数点以下の項.000をつけなくても数値の型変換により


実数値に変換されます。


solarplexussより */



ソーラー「それではっ


次のプログラムを


#include <stdio.h>


int main(void)

{

double a;

a=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018 ;


printf("%f\n",a);

return 0;

}


solarplexussより


ここでご注意!


桁の多い数値をprintf()関数をもちいて表示したいときは


どんなに()内の数値がながくてもprintf()を次のように1行に


printf("%f\n",1.23456789876543212343456789);


おさめてコンパイルしてください。


printf("%f\n",1.2345678987654

3212343456789);

printf("%f\n",1.2345678987654

32123434

56789);

のように


数行にわけてエディターに記述し


実行するとエラーが表示されます


あるいは


エディタ上で


a=0.00000000000000000000000000000000000000000000000000000000000000000000000000;


のように


数値を分割して記述してはいけません




このカクヨムでは1行に書き込める文字の数が限られているので


このプログラムのように


#include <stdio.h>


int main(void)

{

double a;

a=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018 ;


printf("%f\n",a);

return 0;

}


と変数aに格納されることになる数値を5行にわけて記入しています(^^)/


が、本当にエディタ上でプログラムを打ち込むときは


数値は同じ行内に打ち込んでください


😝実はこのままコピペしてもOKです


なぜかちゃんと


エディタには変数aに格納されることになる数値は1行におさまって表示されます


やったね😝


ソーラー 「コンパイルっ」


プログラムの実行結果(EAZY IDECの場合)

プログラムの実行結果(Visual Studioの場合)


0.000000

続行するには何かキーを押してください・・・_


ソーラー 「な、なんという・・・


そ、そうか


%f出力変換指定子をつかったprintf出力表示では小数点以下6位までしか


出力表示されないので 


double a;

a=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018 ;


のように


どんなに小さい数をdouble型の変数aに格納したとしても


結局


0.000000としか出力されないのか~~(^^)


意外とコンピューターにとっては


お手軽で便利???な~んちゃって。


次は

16000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


00000000000000000000000000000000000000000000000000


000000000.000を


%f出力変換指定子をつかって


コマンドプロンプト画面に


printf出力表示してみましょうかな😊/」





こ~んなに桁数の多い数値

ちゃ~んとdouble型の変数aに格納できてるんでしょうか?


こ~んなに桁数の多い数値

ちゃ~んと

コマンドプロンプト画面に


printf出力表示できるんでしょうか?


さっきの桁数の大きい数値は


コマンドプロンプト画面に


正しくprintf出力表示できませんでしたね。


皆さん、どう思われますか?


それもプログラムを組んでコンパイルしてみれば


すぐにわかることです。


なんか とっても楽しみです。


                solarplexussより


ちょっと休憩、休憩







ソーラー


「それではっ(^^)/みなさん お待たせいたしました


いよいよ 次のプログラムを~


#include <stdio.h>


int main(void)

{

double a;

a=1600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000;

printf("%f\n",a);

return 0;

}


ソーラー 「コンパイルっ」


プログラムの実行結果(EAZY IDECの場合)



1600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000



プログラムの実行結果(Visual Studio2018の場合)


1600000000000000048204255840224868004624778463639512206131372767845238613404233972513779770030633221709190148827476452508747094618698203751501599203192915197804586329879074208041663529049967289635874548843121660526102616384456499186628705994268223575383080960.000000





そして お待たせ 次はいよいよ





プログラムの実行結果(Visual Studio2019の場合)




1600000000000000048204255840224868004624778463639512206131372767845238613404233972513779770030633221709190148827476452508747094618698203751501599203192915197804586329879074208041663529049967289635874548843121660526102616384456499186628705994268223575383080960.000000


C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 1993856) は、コード 0 で終了しました。

このウィンドウを閉じるには、任意のキーを押してください...





ソーラー「おおっ


統合開発環境EAZY IDECの場合


ちゃんとコンパイルできてる、できてる!


つまり


こんなに桁数の多い数値でもちゃんとdouble型の変数に格納できて


こんなに桁数の多い数値でもちゃ~んとprintf出力表示できている。


整数値の部分に関しては十分なくらいの桁数が


printf出力表示できている。


統合開発環境Visual Studioの場合


は最初の大きい桁の数値は正しくprintf出力表示できているけど


位が下がってくると


もう めちゃめちゃだね。


統合開発環境EAZY IDECがんばってるね~


      萌 萌え💖💖💖~~~~~~~



それにしても・・・


変数の型double型の変数に収められた実数値を


コマンドプロンプト画面に


printf出力表示するとき


あまりにも

printf出力表示可能な


その実数値の整数値の部分の範囲と


その実数値の小数点以下の部分の範囲では


差がありすぎるね。


小数点以下は6桁までしか表示されないからね。」  

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る