プレイ日記
倍精度浮動小数点型を2進数から定義するのって駄目なんかな。色コードみたいに、幾つかの数値をひとつに纏めたいときに64bit使えたらなーとか考えてたけど……
4そうだね
プレイ済み
返信[1]
親投稿
2進16進周りのやつって全部整数型なんだよねぇ&bとかも32桁を越えて書けないはず。
1そうだね
プレイ済み
返信[2]
親投稿
おおみの Omi-no-mino-398
昔のBASICのMKD$()/CVD()みたいなのを自作するしかないかなと思って倍精度の仕様見てみたけど…難しい。 まあMKD$()は64bitの2進数ではなく4文字の文字列(アスキーコード8bit×4)に変換する関数なのでちょっと趣旨は違いますが。
0そうだね
プレイ済み
返信[3]
親投稿
おおみの Omi-no-mino-398
× 4文字の文字列(アスキーコード8bit×4) ○ 8文字の文字列(アスキーコード8bit×8) 4文字だと単精度実数ですね…MKS$()/CVS()だ。
0そうだね
プレイ済み
返信[4]
親投稿
moh6an moh6an
ビットシフトとANDでできる・・・かな?
0そうだね
プレイ済み
返信[5]
親投稿
MIKI ifconfig
倍精度浮動小数点数(double)の構成要素は ・符号:1bit ・指数:11bit ・仮数:52bit なので「うまいこと計算する」とdoubleと64bitの相互変換は可能です。 ところが、double で表現可能な nan というやつがいて、 これは特定のビットパターンを持っているのだけど nan に対してはさっきの「うまいこと計算する」ことができなくなってしまいます。 例えば nan<0 も nan>0 も 0 になるし sgn(nan) も sign(-nan) も 1 になるし nan*2.0 や nan/2.0 はやっぱり nan だし。
2そうだね
プレイ済み
返信[6]
親投稿
MIKI ifconfig
てなわけで、複数の数値を一つにまとめたいなら普通に整数配列(または文字列)を使ったほうが簡単です。 ただし文字列にぐちゃっとしたビットを詰め込むと、保存するときに 1.5 倍にふえるわかめちゃん。
1そうだね
プレイ済み
返信[7]
親投稿
ツララ LongIceSword
VAL()関数も32ビットを越えた2進数文字列を変換させると0になっちゃうんですね。 倍精度実数で四則演算が有効な数までは31ビットまでを一区切りにして(整数型だと32ビット目は符合ビットなので計算がおかしくなるかも) いったん10進数にしてから、2の乗数を掛け算して足していけば(擬似的にビットシフト)格納までは出来るかも? 倍精度実数を2進数のビット列に変換して情報を取り出す方法は、確かおちゃめさんがそんな感じの自作関数を作られてたのを見た気がしますけど・・・ 「うまいこと計算する」の内訳ってこんな感じです? でもメモリの使用量の違いが整数型と倍精度実数でカッチリ2倍くらいの差だったら、整数型で全部のビットを使って上位32ビット下位32ビットの仮想64ビットみたく使った方がお得だったりするんですかね?
1そうだね
プレイ済み
返信[8]
親投稿
myu314 myu314
以前、浮動小数点数と整数x2の相互変換関数作ったことあります。 【 4K4PJXP3 】 今だとCLASSIFYがあるから、nan/inf周りはそっち使ったほうがスマートなんだけど、参考になれば。 でもMIKIさんと同じく、こんな面倒なことをするより整数配列/文字列使うほうが簡単だし速いっす。
3そうだね
プレイ済み
返信[9]
親投稿
ツララ LongIceSword
A#[N]みたいな1次元の倍精度実数の配列と、A%[2,N]みたいな2次元の整数型配列って使うメモリの量は同じなのかなと思って調べてみたら 倍精度実数の配列の方が使用メモリ量少なかった。 更に整数型の配列でも、A%[2,N]とA%[N],B%[N]みたいな2次元一つと、1次元二つって感じで比べてみたら、2次元配列の方が使用メモリ量少なかったッス。 意外な発見。 っていうか別にこれってメモリーの仕組みを詳しく知ってる人には当然過ぎて 今更なことだったりするのかな・・・ 多次元配列ってPUSH命令とか使えないから、無理矢理1次元配列を2次元っぽく使ってたりしてたけど、素直に多次元配列使った方がお得な場合もあるんだなぁ。
2そうだね
プレイ済み
返信[10]
親投稿
メモリの使用数は増えるし、線形リスト作ろうとしたら添え字やら次元やら工夫しなきゃだけど、素直に整数型2つ作った方が良さげですね……
1そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
任意の実数を2進数に変換するBIN$関数ならば以前作ったので参考にしてみてください。 https://miiverse.nintendo.net/posts/AYIHAAAEAAArVRTkBciitw ただし、後から公式に加わったBIN$と関数名がダブってしまっているためリスト中のBIN$はBIN2$等の別の名称に変更する必要があります。 inf、-inf、nan、-nanにもちゃんと対応しています。 これとは逆に64桁の2進数を実数型に変換する関数DECIも用意しましたが、infやnanの組み合わせとなる2進数はたくさんあるため対応させていません。(すべての場合を網羅ではなく一例を用意するだけならば簡単に対応は可能)
0そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
この64桁の2進数変換を使い1つの実数型で63個(64個の管理ができないのは上記のようにinfやnanがあるため)のフラグ管理が可能なFLAG関数も作りましたが、実用性という面では微妙です。 整数型ならばこんな面倒なことをしなくても32個のフラグ管理が可能です。 実数型1つでどうしても管理したいというのでなければ普通に整数型を使ってください。
0そうだね
プレイ済み
返信[13]
親投稿
おちゃめ ochame_nako
mor6anさんへ シフト演算もビット演算も整数型のみ対応しています。(整数型の範囲外の数はOverflowとなる) なお、実数型の数値で計算すると自動的に型変換が行われます。 これは、逆に言えば -1 AND A とか 0 OR A とか A>>0 で整数化できるということです。 ちなみにこの上記の方法による整数化はFLOORとは異なり、絶対値が小さくなる整数化なので負数の場合はFLOORとは挙動が変わります。 またFLOORは整数値にはしてくれますが、整数型にはならないため実数型と整数型で挙動が異なる自作関数を作っている場合には注意が必要です。 myu314さんへ リストを拝見しましたが、現状では絶対値が2の-961乗以下の数は正しく動作しないですね。 正常動作させるためには場合分けが必要になります。
0そうだね
プレイ済み
返信[14]
親投稿
整数型に変換されるのは初めて知ったなぁ たまに0ビットシフトしてるコードがあったりするのはそういうことなんですね
0そうだね
プレイ済み
返信[15]
親投稿
myu314 myu314
>おちゃめさん チェック漏れてました、お恥ずかしい。 確認ありがとうございます:)
0そうだね
プレイ済み