2020年11月25日
川俣晶の縁側ソフトウェアC# コーディング How Tototal 367 count

【入門級】floatの最大値に1を足すと何が起こるのか?

Written By: 川俣 晶連絡先

 int型の変数に入ったint型の最大値int.MaxValueに1を足すとcheckedコンテキストだとOverflowException 例外が起きます。

 では、クイズです。

 float型の変数に入ったfloat型の最大値float.MaxValueに1を足すと何が起こるでしょうか

  1. checkedコンテキストならOverflowException 例外
  2. ∞になる
  3. 最小値に戻る
  4. 値は変化しない

 答は【値は変化しない】です。

 なぜでしょう?

 float型のような【浮動小数点型】は小数点を移動させることで極大値、極小値に対応します。そのため、有効桁数が限られるため、小さすぎる値は反映されなくなります。

 1は小さすぎないだろう……と言いたい気持ちは分かりますが、floatの最大値3.4028235掛ける10の38乗と比較すると、ゴミのように小さな値になります。

 もし、1を足す代わりに2を掛けると、結果は∞になります。極大値に2を掛けると、極大値+極大値ということになって極大値以上の極大値になるからです。数学的に正しい結果ではありませんが、表現可能な範囲を超えてしまったことを示しています。

罠の数々 §

  • 数値の表現力を限界まで使うといろいろ不思議なことが起こる。小さな値で上手く行った方法が大きな値でも通用するとは限らない。注意しよう

参考リンク §

checked (C# リファレンス)

Int32.MaxValue フィールド

OverflowException クラス

Single.MaxValue フィールド

 int型はInt32という名前になっていることに注意しよう。名前が違うのはC#と.NETでの名前に差があるからだ。ではSingleは実際には何型だろうか。上記リンクから確かめてみよう。

リポジトリ §

https://github.com/autumn009/cshowto

floatMaxPlusOne §

using System;

class Program

{

    static void Main()

    {

        checked

        {

            try

            {

                int a = int.MaxValue;

                for (int i = 0; i < 5; i++)

                {

                    Console.WriteLine(a);

                    a++;

                }

            }

            catch (OverflowException e)

            {

                Console.WriteLine(e.Message);

            }

            try

            {

                float a = float.MaxValue;

                for (int i = 0; i < 5; i++)

                {

                    Console.WriteLine(a);

                    a++;

                }

            }

            catch (OverflowException e)

            {

                Console.WriteLine(e.Message);

            }

        }

    }

}

実行結果

2147483647

Arithmetic operation resulted in an overflow.

3.4028235E+38

3.4028235E+38

3.4028235E+38

3.4028235E+38

3.4028235E+38

Facebook

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?
キーワード【 川俣晶の縁側ソフトウェアC# コーディング How To
【C# コーディング How To】の次のコンテンツ
2020年
11月
26日
【入門級】時間比較が失敗する場合
3days 0 count
total 387 count
【C# コーディング How To】の前のコンテンツ
2020年
11月
24日
【入門級】継承関係にないクラスの同名メソッドを同じように呼び出す
3days 1 count
total 352 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20201125094610
サイトの表紙【C# コーディング How To】の表紙【C# コーディング How To】のコンテンツ全リスト 【C# コーディング How To】の入手全リスト 【C# コーディング How To】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.