天国にいけるC言語入門 シーズン1 パソコン超初心者がゼロから東方風シューティングをつくる編 ver.0.4.15.790 RELIEF
☆変数の型 float型 double型の変数は大変小さな数値を格納することができますが %f出力変換指定子の働きにより小数点以下6桁までしかコマンドプロンプト画面にprintf出力表示されません
👇のエピソードのように古い統合開発環境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桁までしか表示されないからね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます