注:-の半角が表示出来ないので全角の-になってます
1. まず、これはなんですか?
HSP-Boostとは、C++の力の根源たる魔境、BoostライブラリからHSPで使えてHSPの機能強化に
役立つと思われるものを纏めたものです。
Longintからグラフ(数学的なもの)まで、様々なことが出来るようになる……はず。
2. 導入の仕方
https://github.com/Velgail/HSP-Boost/
のReleaseLib?からDLLがダウンロード出来ます。.asファイルをcommonに、dllファイルをhspの
エディタ等のルートに配置してください。
なお、現在のところドキュメント整備が進んでいません。ダレカタスケテー
3. 貢献したい
GitHub?でプルリクエスト投げつけてください。
4. ライセンスどうなの?
もともとLongintのライセンスが不明であるために別アプローチを取って作り直しを図ったラ イブラリです。
ライセンスはBoost Software License 1.0で、簡単に意訳すると
・ライブラリは無保証で、バグって損害が発生したりしても何も法的義務は負わないよ
・自由にライブラリを使っていいよ(商用もOK)
・ライセンス表記はコードに書いてあればいいよ。READMEとかにいちいち書かなくていいよ
//注:ヘッダにBSLのライセンス文書いてありますので、そのままincludeして使えば全く問題ありません。
>kikerogaさん
>このスレッドに書く内容かどうか少し迷いましたが…
そんなこと言わずにどんどん書き込んじゃってくださいよー
>Velgailさん
>現在超多忙(HSP掲示板見るの何ヶ月ぶりだ……?)につき始めはしないけど。
最近見ないなーと思っていたら(超!)
多忙だったんですね
さてさて たまにたまに考えているんですけど
HSPでBIGFloatを使いたいんですよね
小数点以下4桁まで。とか10桁までとか決め打ちすればLongInt?を転用すればいいので
意外と簡単に実現できそうなんですが
考えがまとまらなくてイマイチコードに落とせないんですよね
小数点以下4桁
longintの下4ケタを小数とする
intの足し算、引き算、掛け算、割り算、大小比較
下4ケタを小数の数として計算する
実数、10000掛けて演算して10000で割る
intの足し算、引き算、掛け算、大小比較
割り算、割り算は、計算、ちょっと特殊かも
longint同士の演算
下4ケタを小数の数として計算する
小数点以下10桁
intを演算の対象外とする
10000000000掛けて演算して10000000000で割る
doubleの足し算、引き算、掛け算、大小比較
割り算、割り算は、計算、ちょっと特殊かも
longint同士の演算
下10ケタを小数の数として計算する
とかくらいまで構想してるんですが
なかなか漏れなくダブリなくでコードに落とせなくて
誰か書いてくれないかなーってかんじでしたw
考えてることをNETに書くと
それ以上やらないの公式。はたまに発言してるんですけど
自分の力量でこなせなさそうなので
逆に構想をUPしてみました
>NO.78544 Y_repeatさん
データメモリの管理としてはint64で済みますけども、道のりはこんな感じになるんかな?
1.型を増やす。増やした型内で完結できる演算を定義する。
2.増やした型から既存型、既存型から増やした型へのキャストを追加する。
3.実行コード内に散るintとdouble特例コード達を見つけ出し片っ端から対応コードを埋める。
4.サフィックスを用意し、定数を持てるようにする。
とりあえずBIGFloat同士の演算はたやすいでしょう。積が若干ややこしいかなくらい。
型を増やした分、キャストが正しくできれば演算もすんなりできるでしょう。右辺の型は左辺の型に合わせられるので。
ただ、doubleからのキャストは境界チェックをしないといろいろ問題が増えます。
実行コード内にいる数値型特例コードがゴロゴロ見受けれらるので、こちらをどうにか措置できれば実現まで大きく近づきます。
特にcomやAPI呼び出しなどの外部処理周りに多そうに見えます。
最後に、コンパイルや中間コードレベルでBIGFloatの型の値であることを宣言できるバイナリを用意する道筋を考えましょう。
そうしなければ必要に応じて逐一キャスト関数で囲わなければ値を作り出せません。非常に不便です。
おまけでHGIMGなどのHSPVAR型を読み込むような子に逐一実装が正常に動くか試さないとダメよ。
なお、HSPCMPには定数宣言にのみ使えるkというサフィックスがいます。これは何ものでしょうね?
float拡張は小数点以下。4桁か10桁への決め打ちなので
Plus_floatモジュールと命名しました
以下ver0.02です
進捗はとりあえずモジュールの枠組み作成とsetter getterの作成くらいっすw
http://zuzazann.boy.jp/media_wiki_120/index.php?title=Plus_float_module_ver0.02
近々鯖移転によりwikiも移転予定だったり
桁は決め打たなくても実現出来そうな気もしています
>堀木さん
型拡張とか大がかりなのは考えてないですね
オブジェクト演算型のモジュールで実装する予定です
アレですね 予定をNETに書いても返信もらえればOKなのか
やっぱ都市伝説の範疇なのか
でもしばらく実装に挑戦した上で書き込みたいので
あんまり仕様とか詳しく書かない方針です
ところで longint.dll のREADMEに
【 取扱種別 】フリーソフト
■著作権
・著作権は、blueleafが保有します。
と書いているんですが
こういうのって再配布不可なんですか?
ゲームで使用してて
HSPやらない人とかlongint.dll 導入していない人とかが
PLAYしようとしたら動かないですよ
ということは再配布可のdoubleの桁拡張モジュールとか
あった方がいいのだろうか?
再配布可のBIGNUMとか
必要であればGitHub?で激闘しましょう。
1. hspsdkからhpi3typeをベースとする。
当該hpi3typeはfloatを組み込めるようにするライブラリのソースである。
2. C++ Boostからboost::multiprecision::cpp_intクラスをfloatの代わりに実装してコンパイル
3. ヘッダファイルを正しく記述する
これで容易に「実質的なパブリックドメイン(Boost Software License 1.0条項上)」のLongInt?ライブラリが作れます。
また、多倍長浮動小数点数(doubleより高い桁数のモノ)に関しては、同じように
boost::multiprecision::number<boost::multiprecision::cpp_dec_float<N>> (Nは桁数)
を利用して作れます。
C++界隈にどっぷりして溺れてください(笑)
そしてHSP++作りましょうw
ということで、リポジトリだけ作ってみた
https://github.com/Velgail/HSP-Boost/
ちなみに、Boostってこんなのが大量にあるライブラリ
http://www.boost.org/doc/libs/ (英語)
真面目に使うとHSPが凄まじいことに……
Boost-Longint、多分longint.hspのlongintとほぼ同じもの。
ライセンスはBoost Software License。C++部もBSLですが、
HSPSDKのライセンスについてはおにたまさんの解釈待ち。
サンプルソースがBSDだと、BSDの対応しなきゃならんのだが……
LongInt?の方(オリジナル)はそれ書いてないんだよなぁ…… どうなのかな?
あと、 開発環境がVS2017とかいう超最先端のVSを使っているので、相当に事故のリスクがあります。
Boostは1.63です。
BOOST_ROOTとBOOST_LIBという環境変数を設定しなきゃコンパイルできません。
……といった話をGitHub?に書いとかないとw
うるさいちょっと使って見れればいいんだ! という人は、リポジトリのReleaseLib?/Boost- Longintから一式引っ張ってください。
asはcommon、dllはroot……ってアタリマエのことやっといてください。
「固定小数点形式の型」と「long doubleないしそれ以上の型」
が求められている?
あってますか?>Y_repeatさん
>Velgailさん
>「固定小数点形式の型」と「long doubleないしそれ以上の型」
>が求められている?
たぶん合ってまーす。2種類ですね
型っつーかモジュール変数を念頭に作ってました
自分はプログラム全般に適正ないのか
新しい型の作り方はわからないので
>ゴリゴリと徹夜コーディングしたら、出来た。
一晩で割とたくさん出来ますよね 自分も書いたの一晩でしたw
>asはcommon、dllはroot……ってアタリマエのことやっといてください。
自分はasもdllも同梱派ですね
>開発環境がVS2017とかいう超最先端のVSを使っているので、相当に事故のリスクがあります。
ということは一年くらい寝かしてけば 大分安定します?
>「固定小数点形式の型」
やってみたかんじ 小数点以下10桁固定が実現できれば
小数点以下300桁とか(doubleがこのへんまでなので)
10000桁とか割と簡単に拡張出来そうですね
それ以下とかは科学計算っぽさが大きいので
HSPではやらない方がいいか
自分で拡張しましょう。なのかな
よし、ライブラリ群のプロジェクトを作ろう としたときの敷居が若干高いという意味ですw
まあ、今までのVSより圧倒的に高速インストール出来るので、この機会に是非(笑)
C++14で作りたいからっ(そういう理由)
Boost-Longintで文字列初期化が失敗する現象。
ベースとしたhpi3typeでも起きているため、どうやればいいのか不明だったり(汗)
……読まなきゃ
https://github.com/Velgail/HSP-Boost/
Boost-FixedPoint?→plus float module代替C++ライブラリ
Boost-Longint→longint代替C++ライブラリ
Boost-LongFloat?→未着工:plus double module代替C++ライブラリ
Boost-FixedPoint?は、1つの桁数(小数点以下何桁までが1通り)の物しか作れません。
複数パラメータ引ける可能性が出てきたので、あとでやれるとは思いますがね……
あと、FixedPoint?は全ての操作で、常に切り捨てを行うので注意?
軽く動作確認してみました
sampleを実行してみたところ
c=boost_fixedpoint(c)
がerrorになりました
c=boost_fixedpoint(1.234)
に変更すると動きました
後はアレですね
小数点以下何桁まで表示できるか設定したいですね
#define boost-fixedLevel 4
という記述が計算桁数だと思いますが
(そもそもこの類推が間違いかもしれませんが)
もっと桁数多く演算してるような
#define boost-fixedLevel 4
asの方を書き換えたら動作しました
c=boost_fixedpoint(c)
3.5B(ブログからDLっするやつ)でもerrorでした
自分のOSが古いのもあるかもしれません
win7PROでやってるので
でもdll使用GAMEとかで使ってもらえる人
win7いるかもしれないし
(いや、ライセンス違反でゴリ押せば(;y=ー( ゚д゚)・∵. ターン
まあ、それ以上の難題にぶつかっているので…… まだまだ
#define boost-fixedLevel 4 #include "Boost-FixedPoint.as" a=boost_fixedpoint(1.236) b=boost_fixedpoint(1) mes a mes b h=boost_fixedpoint(0.0) h+=boost_fixedpoint(1.0) h+=boost_fixedpoint(0.456) mes h i=boost_fixedpoint(0.0) i+=boost_fixedpoint(123.0) i+=boost_fixedpoint(0.456) ; mes i
>アクセサメソッド
どのオブジェクトの?
>一文字違い
文字列距離という言葉で検索すれば結構簡単に出てくるはず。
以上、簡単にまとめておきます。明日は朝イチの特急+新幹線で東京だ(飛行機より安かったのでw)
#include "boost-longint.as" after_mul=boost_longint(1) repeat 100 after_mul*=10 logmes ""+after_mul await 1 loop
こういうのでも誤作動起きますw
なくても出来るdouble拡張書いてみました
http://zuzazann.boy.jp/media_wiki_120/index.php?title=Plus_double_module_ver0.1