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

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

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

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

Q&A

解決済

3回答

690閲覧

実数小数→2進法20桁に変換したい

UniUniPhy

総合スコア21

Java

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

0グッド

0クリップ

投稿2018/07/19 04:29

実数小数を2進法20桁で表記したいのですが、そのノウハウがわかりません。
教えていただける方、教えてください。

Java

1 2public class Bernoulli3 { 3 4 public static void main(String[] args) { 5 double[] x; 6 x = new double[1000]; 7 8 for (int t = 0; t < 20; t++) { 9 x[0] = Math.PI - 3; 10 11 if (x[t] < 0.5) { 12 x[t + 1] = 2 * x[t]; 13 } 14 if (0.5 <= x[t]) { 15 x[t + 1] = 2 * x[t] - 1; 16 17 } 18 // 上記プログラムで小数が出てくる 19 20 // これらを2進数20桁で変換したい 21 22 } 23 24 } 25 26} 27

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

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

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

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

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

guest

回答3

0

2を掛けて、奇数なら1、偶数なら0として、これを繰り返していけばいいのです

投稿2018/07/19 04:55

y_waiwai

総合スコア87719

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

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

UniUniPhy

2018/07/19 05:10

それはif文を使うということですか?
y_waiwai

2018/07/19 05:16 編集

0.1(10進)を2進数に変換 2を掛ける 0.2 -> 0 0.4 -> 0 0.8 -> 0 1.6 -> 1 3.2 -> 1 6.4 -> 0 12.8 -> 0 25.6 -> 1 ということで、0.1(10進)は、0.00011001....(2進) ということになる、ってことですねー
y_waiwai

2018/07/19 05:23

まー、doubleのフォーマット調べて、仮数部を切り出してくればそれで済む話なんだけどw
UniUniPhy

2018/07/19 05:30

数学的な理解はできたのですがJavaでどう表現して良いか思いつきません、、、、
y_waiwai

2018/07/19 05:34

算出の仕方(のうはう)は教えたので、あとはあなたが考えてください
退会済みユーザー

退会済みユーザー

2018/07/20 01:24 編集

この方法だと0.1などの小数では有効ですが3.5などの小数では適用できません。 3.5(10進)を2進数に変換 2を掛ける 7.0 -> 1 14.0 -> 0 28.0 -> 0 56.0 -> 0 ですので、まず最初に整数部分が正の場合、まずその部分を二進数に直し 0より小さい部分を y_waiwaiさんがおっしゃった方法でやればいいと思います。
fuzzball

2018/07/20 01:23

>>Stars1024さん この質問でなぜ整数部を考慮する必要があると思ったのか謎です。 ちなみに 7.0 → 1
退会済みユーザー

退会済みユーザー

2018/07/20 01:28 編集

7.0 -> 1のところを間違えてたのはすみません ですが、3.5などの小数を上の方法でやると14.0以降すべて0になってしまいます。 この方法で求めているのはあくまでも「小数部分」のみです。 ですので整数部分を考慮する必要があります。
退会済みユーザー

退会済みユーザー

2018/07/20 01:27 編集

また整数部分を考えるとその直後に小数点をつければいいのでコードも書きやすいです。
swordone

2018/07/20 01:29 編集

いや、14.0以降全部0で正しいのでは?整数部分を2進変換できないのはさておいて
fuzzball

2018/07/20 01:29 編集

>>Stars1024さん 「そんなのは言うまでもないこと」という意味です。 質問のコード内にも小数部だけ取り出すコードがありますし(位置が変ですが)、小数部だけ取り出した上で「2進法20桁に変換したい」という質問だと思います。
退会済みユーザー

退会済みユーザー

2018/07/20 01:37

swordoneさんへ その整数部分を2進数変換するために整数部分も考慮したのです。 fuzzballさんへ 題名に「実数小数」と書いてありましたのですべて場合を考慮しただけです。
fuzzball

2018/07/20 01:42 編集

そういう受け取り方をしたのであれば、整数部も含めて20桁にしないといけなくないですか?
guest

0

ベストアンサー

2進数で表したい実数の小数部分をxとし、その2進表記を
イメージ説明
とします。この2進表記は
イメージ説明
ということを意味します。xを2倍すれば
イメージ説明
となり、整数部分を取り出せば小数第1位となります。
そして、これの小数部分をx1、つまり
イメージ説明
として、またこれを2倍すれば
イメージ説明
となるため、またこれの整数部分を取り出せば小数第2位となります。
これを任意の桁数繰り返せばいいのです。

投稿2018/07/21 01:12

swordone

総合スコア20649

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

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

0

まず最初に入力した実数の整数部分を取り出します。その部分をまず
2進数に直します。

残りの小数部分はy_waiwaiさんがおっしゃった方法でやればいいです。

小数部分を2進数に直す

0.1(10進)を2進数に変換

2を掛ける
0.2 -> 0
0.4 -> 0
0.8 -> 0
1.6 -> 1
3.2 -> 1
6.4 -> 0
12.8 -> 0
25.6 -> 1

つまり小数部分を切り捨てた整数部分のみで偶奇の判断をすればいいことになります。
プログラミングではintでキャストすればいいです。

後はfor文で20回繰り返しましょう。(2倍するのを忘れずに)

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args){ 5 6 Scanner sc = new Scanner(System.in); 7 double num = Double.parseDouble(sc.nextLine()); 8 int IntegerPart = (int)num; 9 num -= (double)IntegerPart; 10 String bin = Integer.toBinaryString(IntegerPart); 11 12 int []data = {0,1}; 13 14 for(int i = 0; i < 20; i++){ 15 if(i == 0){ 16 System.out.print(bin + "."); 17 } 18 else{ 19 System.out.print(data[(int)num % 2]); 20 } 21 num *= 2.0; 22 } 23 } 24}

投稿2018/07/20 01:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問