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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

2649閲覧

unity c#でdoubleからbyte配列,long及びその逆

anatawa12

総合スコア56

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

1クリップ

投稿2017/02/19 11:58

編集2017/02/20 03:50

IEEE754で定義されてる2をきすうとしたケチ表現でdoubleからbyte配列及びlong/ulongに変換及び逆変換したいです。
順番は、sign,exponent,fractionの順番です。
リストにまとめます。
IEEE754
ケチ表現
sign,exponent,fractionの順番
doubleからlong,byte配列及び逆変換


追記3
ひつようなりゆうは、unityでげーむをつくっているときにmodを作るためのげんごのじっそうのためです。


追記2
不備が多くてごめんなさい。
long,byte配列からのはできました。

c#

1public double to_double(ulong a){ 2 double c = (((a & (0x7FF << 52))>>52) - 0x400); 3 return (((a & (1UL << 63)) < 0) ? 1 : -1) * 4 (c > 0 ? ((b(a,11) + 1) * Math.Pow(2, c)) 5 : c < 0 ? (b(a,11) + 1) / Math.Pow(2, c) 6 : (b(a,11) + 1)); 7} 8public double to_double(byte[8] a){ 9 return b((a[7]*Math.Pow(2, 0)) + (a[6]*Math.Pow(2, 8)) + (a[5]*Math.Pow(2, 16)) + (a[4]*Math.Pow(2, 24)) + (a[3]*Math.Pow(2, 32)) + (a[2]*Math.Pow(2, 40)) + (a[1]*Math.Pow(2, 48)) + (a[0]*Math.Pow(2, 56))); 10} 11double double_decmial(ulong a, int x){ 12 if(x != 11){ 13 return (((a & (ulong)Math.Pow(2, x))<<x) * 2 / (ulong)(12-x)) + b(a,x-1); 14 }else{ 15 return 0; 16 } 17}

また、複数の問題があるので、しつもんをとりさげたいとおもってます。


追記1
①これはどこの課題でもありません。
②fraction部の小数を作るところで戸惑ってます。
できてる範囲は

((a & (1L << 63L)) ? 1 : -1) * ((a & (0x7FF << 52))>>52)

こんな感じです

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

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

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

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

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

Zuishin

2017/02/19 13:13

何かの課題だと思いますが、自分で意味が分かっていますか?
Zuishin

2017/02/20 01:34

メソッド名がひどいですね。とても実用とは思えません。課題なら課題でわからないところを聞いてもいいんですよ。でもその前に課題の内容を理解しましょう。そして自分の知識がどの程度あるのかを示し、最初から全部教えてくれじゃなくてわからないところだけ聞きましょう。
ozwk

2017/02/20 03:16

そもそもなんで変換したいのか教えてください。
guest

回答2

0

投稿2017/02/19 12:04

ozwk

総合スコア13521

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

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

anatawa12

2017/02/19 12:21 編集

どんな環境でも同じ動きをさせたいので説明を見る限りはできなそうなので、できるのをよろしくお願いします
ozwk

2017/02/19 23:50

「できてる範囲は~」と書かれているものもC#コードとして間違えてるし、 doubleをlongにしたいっていうのも曖昧だし、 バイト配列にしたってエンディアンがどっちかわからないし
KSwordOfHaste

2017/02/20 01:44 編集

自分には最初の質問文の内容が「質問意図を充分表現していない」と見えます。 ・APIではなくアルゴリズムが知りたいのでしょうか? ・それともAPIでいいんでしょうか? 後者ならozwkさんの回答が適切なヒントに見えます。 前者ならば以下のようにすべきと思います。 ・タグ「C#」を外し「アルゴリズム」を追記 ・「APIや浮動小数点演算を用いずに」という条件を質問に付与 ・ついでに「なぜそのようなことをしたいのか」の目的もあるとベター 自分ならC#でIEE754の形式を得たいと思ったときozwkさんの回答と同じことを考えます。なぜならC#の言語仕様書に「The two floating point types, float and double, are represented using the 32-bit single-precision and 64-bit double-precision IEEE 754 formats.」とあるからです。
KSwordOfHaste

2017/02/20 01:55

あえてもう一つ追記します。ozwkさんの回答は内部表現をバイナリーで取り出すためのAPIです。C#の内部表現はIEEE754 formatと規定されているので、このAPIを用いれば自然に目的にかなった結果が得られるのです。APIの結果のエンディアンはインテルプロセッサがリトリエンディアンであるためリトルになりますがそれをビッグに変更するのは単にバイト順を逆転すればよいだけなのでささいな違いなのです。おそらくはその辺りが不明だったのではないでしょうか?
guest

0

ベストアンサー

質問の答としては ozwk さんの回答がベストだと思います。環境の違いによる動作の違いを気にされているようですが、Unity と C# という条件が決まっているので問題にはなりません。

目的が自作ゲームをユーザーが拡張できる言語の実装のためと捉えました。
しかし、新言語を実装するのにバイト配列との相互変換を新たに作り直すことが必要とは思えません。既存のもので十分、むしろ既存のものの方が品質が高いのではないかと思います。
むしろインターフェースに注力すべきでしょう。

また、新言語を作成するにあたり、構文解析が必要になりますが、これはかなり厄介です。
演算子の評価順について悩まれているようですが、このあたりは一つ一つ見ていくときりがありません。コンパイラコンパイラが使えない状況であるので、このような場合ははテキストをトークンに分割し、構文解析を再帰的に適用します。term のフェーズや expression のフェーズ、様々なフェーズで評価順を決定するのに数値だけ単独で作っていたのでは後々破綻するでしょう。共通する枠組みが必要になります。

C# には C# ソースをコンパイルして実行する機能が含まれています。内部オブジェクトのインターフェースを公開して文法解釈はそちらに任せるというやり方もあります。

あるいはリモートオブジェクトを使う方法もメジャーです。COM では Windows に限定されてしまいますが、.NET にもリモートオブジェクトを使用する様々な仕組みが用意されていますし、例えば json で記述したコマンドをやり取りする方法もあるでしょう。

新言語を搭載し、サンドボックスで動作させるのは面白いと思います。しかしその道のりは大変険しい物です。楽ができるところでは楽をしましょう。バイト配列との相互変換は楽ができるところだと思います。

投稿2017/02/20 08:24

Zuishin

総合スコア28660

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

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

Zuishin

2017/02/20 08:40

いや、ozwk さんの方法がいいよ、としか書いてないんですが。 コメント欄と間違えて回答欄に書いてしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問