質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

Q&A

解決済

2回答

955閲覧

java 浮動小数点 float型 表現範囲

infra____

総合スコア90

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

0グッド

0クリップ

投稿2020/03/18 08:48

java 浮動小数点 float型 表現範囲に関して質問がございます。
±3.40282347E+38~ 1.40239846E-45

1.±3.40282347E+38の「±」が」つく理由がわかりません。範囲なのに、なぜ2つの値からスタートするんですか?
2.+3.40282347E+38の方が1.40239846E-45よりも値が大きいのに、なぜ右側に記載されているんですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

範囲なのに、なぜ2つの値からスタートするんですか?

浮動小数点数の仕組み上、絶対値の大きい方と小さい方、それぞれに限度があります(0は別枠で表現できますが)。使える範囲は「-3.40282347E+38~-1.40239846E-45」と「±0」と「1.40239846E-45~3.40282347E+38」となります。

+3.40282347E+38の方が1.40239846E-45よりも値が大きいのに、なぜ右側に記載されているんですか?

おそらく、特別な意味はないです。ただ、「極端に小さな値」より「極端に大きな値」のほうが問題になるケースが多いので、先に書いたのかもしれません。

投稿2020/03/18 09:02

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

infra____

2020/03/18 10:05

ご返信ありがとうございます。 理解力が低くて申し訳ございません。 「絶対値の大きい方と小さい方、それぞれに限度がある」とはどういうことでしょうか?(>_<)
maisumakun

2020/03/18 10:08

「使える範囲は」以下に書いてあるとおりで、0周辺にも値を表現できない領域が存在しています。
otn

2020/03/18 15:32

大きいほうに限度があるのは分かりますよね? 小さいほうも「限度がある」というのは、例えば「+1.0E-99という値は表現できません」という意味です。 有限個数のビットで表すための制限です。
guest

0

java 浮動小数点 float型 表現範囲に関して質問がございます。

±3.40282347E+38~ 1.40239846E-45

1.40239846E-45 ではなく、1.40129846E-45 ではありませんか?

Java

1class F { 2 public static void main(String[] args) { 3 print(0x00000000); 4 print(0x00000001); 5 print(0x007fffff); 6 print(0x00800000); 7 print(0x7f7fffff); 8 print(0x7f800000); 9 print(0x7f800001); 10 print(0x7fffffff); 11 } 12 13 static void print(int i) { 14 float f = Float.intBitsToFloat(i); 15 System.out.println(String.format("%08x: %.8e", i, f)); 16 } 17}

実行結果

00000000: 0.00000000e+00 00000001: 1.40129846e-45 007fffff: 1.17549421e-38 00800000: 1.17549435e-38 7f7fffff: 3.40282347e+38 7f800000: Infinity 7f800001: NaN 7fffffff: NaN

00000000 は +ゼロ
00000001~007fffff は非正規化数
00800000~7f7fffff は正規化数
7f800000 は無限大
7f800001~7fffffff は非数(Not a Number)

80000000~ffffffff は負数

投稿2020/03/18 10:38

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xebme

2020/03/18 13:11

これでもわかります。 System.out.println(String.format("%.8e",Float.MIN_VALUE)); // 1.40129846e-45 IEEE 754-2008 非正規化数( サブノーマル)に違いがあるようです。以下はドイツ語です。 https://www.informatik.uni-leipzig.de/~meiler/MuP.dir/MuPWS14.dir/Vorlesung/Kap00_MZ.pdf IEEE: ±1.40239846 E -45 Java: ±1.40129846 E -45 Java言語仕様では精度表現を避けています。 java se 8 : The smallest positive finite non-zero literal of type float is 1.40e-45f どなたか、わかりやすい解説をお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問