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

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

ただいまの
回答率

90.32%

  • アルゴリズム

    428questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 625

anatawa12

score 48

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


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


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

public double to_double(ulong a){
    double c = (((a & (0x7FF << 52))>>52) - 0x400);
    return (((a & (1UL << 63)) < 0) ? 1 : -1) * 
        (c > 0 ? ((b(a,11) + 1) * Math.Pow(2, c))
         : c < 0 ? (b(a,11) + 1) / Math.Pow(2, c)
         : (b(a,11) + 1));
}
public double to_double(byte[8] a){
    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)));
}
double double_decmial(ulong a, int x){
    if(x != 11){
        return (((a & (ulong)Math.Pow(2, x))<<x) * 2 / (ulong)(12-x)) + b(a,x-1);
    }else{
        return 0;
    }
}


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


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

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


こんな感じです

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2017/02/19 22:13

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

    キャンセル

  • 退会済みユーザー

    2017/02/19 22:14

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • Zuishin

    2017/02/20 10:34

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

    キャンセル

  • ozwk

    2017/02/20 12:16

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

    キャンセル

回答 2

+2

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/19 21:21 編集

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

    キャンセル

  • 2017/02/20 08:50

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

    キャンセル

  • 2017/02/20 10:37 編集

    自分には最初の質問文の内容が「質問意図を充分表現していない」と見えます。
    ・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.」とあるからです。

    キャンセル

  • 2017/02/20 10:55

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

    キャンセル

checkベストアンサー

0

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/20 17:40

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

    キャンセル

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • アルゴリズム

    428questions

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