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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

浮動小数点

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

Q&A

解決済

1回答

4491閲覧

浮動小数点 変換について

boxerkg

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

浮動小数点

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

0グッド

0クリップ

投稿2021/05/24 12:58

編集2021/05/26 04:18

C#

1 //10進数32bit 1120403456 2 3 //16進数32bit 42c80000 4 5 //2進数16bit 6 //0100 0010 1100 1000 0000 0000 0000 0000  //+100(2進数) 7 //1100 0010 1100 1000 0000 0000 0000 0000   //-100(2進数) 8 uint a = 1120403456; 9 uint g = 3267887104; 10 string bin = "42C80000"; 11 string n; 12 float f; 13 n = Convert.ToString(g, 2); 14 Console.WriteLine(n); 15 f = Convert.ToSingle(n); 16 Console.WriteLine(f); 17```C# 18コード

string text = "12.34";
Console.WriteLine(Convert.ToUInt32(Convert.ToSingle(text)));

追記/* 出力は12になります。 12.34の10進数32bitは1095069860のようにならないのですが間違っているところ足りないところを教えていただきたいです。 */ データをもらうときは、float=100であったりfloat=10.1であったりするのですが 通信機器から直接floatでもらえないためaやgの16進数32bitで受け取ってます。 aやgを2進数に変換した後、floatに戻すにあたって100ではなく1.00001E+30このような形になります。 おそらく正規化などのようなことをする必要があると思うんですが 理解ができないため教えてほしいです。 どういったやり方が最善なのでしょうか。

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

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

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

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

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

KojiDoi

2021/05/24 13:12

正規表現タグは質問と関係ないので外してください。
boxerkg

2021/05/24 13:42

細かいですねww
退会済みユーザー

退会済みユーザー

2021/05/24 14:34 編集

> 通信機器から直接floatでもらえないためaやgの16進数32bitで受け取ってます。 その通信機器のメーカーのデータ仕様書を見るなり、問い合わせるなりすればいいだけの話では。
dodox86

2021/05/24 19:17

送信側が例えば「100」や「10.1」を送るとして、受信側が16進数32ビットで受け取ると結局どういう値になっているのか。送信側が送っている「32ビットの浮動小数点数形式のバイナリの値をそのまま受け取っている」ということなのでしょうか。それとも32ビット分の値を16進数表記の文字列で受け取っているということなのでしょうか。 質問内容から(少なくとも私は)良く分かりませんでした。
ikadzuchi

2021/05/25 00:42

それは正規化ではありませんね。 2進数で表記したものを10進数で読んで単に値が間違っているだけです。 私などはunsafeポインタを使いたくなりますがたぶんactorbugさんの回答が正当でしょう。
dodox86

2021/05/25 01:45

本欄[2021/05/25 04:17]の私のコメントより: > 送信側が送っている「32ビットの浮動小数点数形式のバイナリの値をそのまま受け取っている」ということなのでしょうか。 こちらであった様子。 $ cat t1.c #include <stdio.h> int main() { union { float ff; unsigned char cc[4]; } u; u.ff = 100.0; printf("%02X %02X %02X %02X\n", u.cc[0], u.cc[1], u.cc[2], u.cc[3]); return 0; } $ gcc -Wall t1.c;./a.out 00 00 C8 42
boxerkg

2021/05/25 10:42

ありがとうございます。 参考にさせて頂きます!
guest

回答1

0

ベストアンサー

やりたいのは、こういうこと?

C#

1 uint a = 1120403456; 2 uint g = 3267887104; 3 Console.WriteLine(BitConverter.ToSingle(BitConverter.GetBytes(a), 0)); 4 Console.WriteLine(BitConverter.ToSingle(BitConverter.GetBytes(g), 0));

投稿2021/05/24 13:18

編集2021/05/24 13:24
actorbug

総合スコア2224

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

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

boxerkg

2021/05/24 13:44

今手元にパソコンがないため確認出来ないので明日やってみようと思います! ありがとうございます!
boxerkg

2021/05/25 01:19

うまくいきました。 ありがとうございます。
boxerkg

2021/05/25 15:21

もうひとつ聞きたいことがあるんですが floatの、100をuint aのような形に逆に戻すためにわどーすれば良いのでしょうか?
boxerkg

2021/05/26 01:43

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問