HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0217
支部音符doubleについて21解決


支部音符

リンク

2013/2/17(Sun) 22:03:21|NO.52452

doubleを使って文字列を実数にしたいのですが

id="33333333333333333333" tid=double(id) mes tid
にすると値の後ろが変になってしまいます。
どうにかして後ろが変になるのを食い止められないでしょうか?
よろしくお願いいたします。



この記事に返信する


@key

リンク

2013/2/17(Sun) 23:31:17|NO.52453

実数型で値の後ろが.00000みたいになるのはあたりまえで仕様です
表示するときに.00000が付くのがいやならstrf命令でなんとかしましょう



ヒロソフ

リンク

2013/2/17(Sun) 23:42:26|NO.52454

>@keyさん
スレ主さんが指摘している問題はそこではないと思う。
スレ主さんのコードを実行したら
「33333333333333332000.000000」
と表示されます。

HSPでのdouble型の上限っていくつだったけなあ・・・
もしC/C++と同じならまだ
バッファオーバーフローは起きていないはずだけど・・・



支部音符

リンク

2013/2/18(Mon) 00:02:19|NO.52456

>>ヒロソフさん
はい。問題はそれです。



@key

リンク

2013/2/18(Mon) 00:41:33|NO.52463

intにするともっとひどいことに

HSPでのdoubleはただ実数型なだけで範囲はintと同じだったはず



kanahiron

リンク

2013/2/18(Mon) 01:02:34|NO.52465

>>HSPでのdoubleはただ実数型なだけで範囲はintと同じだったはず
でたらめなことを言わないでください

浮動小数点型の特徴は非常に大きい範囲から小さい範囲までとても幅広く使えます
しかし、その分精度を犠牲にするものです
三千三百三十三京の数ならたった1333の誤差なんて小さいものです
そんな巨大な数を扱うなら128bitの変数が必要です
logint.dllというのが有ります 検索してみてください



支部音符

リンク

2013/2/18(Mon) 01:09:56|NO.52466

>>kanahironさん
ありがとうございます。
longint.dllで確かにでかい数字を扱うことができました。
しかしどうしてもlongint型ではなく標準型でなければいけないのです・・・



pippi

リンク

2013/2/18(Mon) 01:46:29|NO.52468

double型は内部が64bitで先頭1bitが正負、次の11bitが指数部、後ろの52bitが仮数部です。
33333333333333333333をdoubleに変換すると
「33333333333333332000.000000」
になるのはその仮数部の精度の限界があるからです。
仮にdouble型で33333333333333332000.000000の次の数字はというと33333333333333336000.000000
ですので「33333333333333333000.000000」を一つのdoubleの変数で表すのは不可能です。

プラグインを使いたくないという事ならば
int型変数をいくつもつなげて再現してはどうでしょう?



晩御飯

リンク

2013/2/18(Mon) 01:53:36|NO.52469

差し支えなければ標準型でなければならない理由を聞いてみたい



支部音符

リンク

2013/2/18(Mon) 01:53:36|NO.52470

>>晩御飯さん
TsubuyakiSopu.asを使ってちょっとしたbotを作っていて、
そのリプライ機能を使いたいためです•••



@key

リンク

2013/2/18(Mon) 01:59:52|NO.52471

twitter関連でそんな大きい数を使うとは思えないんだが・・・
文字列のまま処理しましょう



晩御飯

リンク

2013/2/18(Mon) 02:13:22|NO.52472

twitterのステータスidはsnowflakeって方法が使われていて確か64bitの整数になるはずだったけど
HSPの整数は32bitなのかな

ステータスid自体を計算することはほぼないんだから文字列のまま持っておけば良いんじゃないかな
もし数値として持っていたとしてもどうせサーバにリクエストを送るとき文字列にしてしまうんだし



晩御飯

リンク

2013/2/18(Mon) 02:43:43|NO.52473

調べてみたらTsubuyakiSoup.asの関数はdouble渡す仕様だったのか
それならTsubuyakiSoup.asに手を入れて文字列型でidを指定するようにするか、
そもそもステータスidを文字列型じゃなくて実数型で持つようにするか



支部音符

リンク

2013/2/18(Mon) 17:39:32|NO.52481

>>晩御飯さん
TsubuyakiSoup.asをいじる・・・うーん難しそうです・・・



@key

リンク

2013/2/18(Mon) 17:51:33|NO.52483

別にバグを修正するわけでもないし簡単なはず・・・
聞くだけで難しそうで遠ざかるのは悪い方向にしか向かないので何事もチャレンジです



hogehoge123

リンク

2013/2/18(Mon) 18:26:06|NO.52485

> TsubuyakiSoup.asをいじる・・・うーん難しそうです・・・
そんな君にはこれ。https://gist.github.com/anonymous/4976129
TsubuyakiSoup.asの改造版を用意しておいたぞ!

あと、スレに返信するのはいいことだと思うけど、明らかに間違い言って撹乱させるのはやめた方がいいと思うぞ。



支部音符

リンク

2013/2/18(Mon) 19:01:29|NO.52486

>>hogehoge123さん
テストしてみたところ正常に動作しました。本当にありがとうございます!
自分でいろいろいじっていたのですがうまくいかなかったところだったので大変ありがたいです。

>>明らかに間違い言って撹乱させるのはやめた方がいいと思うぞ。
すいません・・・次からはちゃんと間違いではないかどうか調べてから返信するようにします。

ほかの皆さんもありがとうございました。botづくり、頑張ります!



晩御飯

リンク

2013/2/18(Mon) 19:01:52|NO.52487

手を入れるのは難しくないけど手間がかかるので勧めない
かと言って実数型でステータスidを持っても既にオーバーフローしてしまうことをさっき思い出したのでこれもダメ
適当言ってすまんかった

ということでhogehoge123さんに感謝を捧げつつスクリプトを使わせてもらうといいと思う



晩御飯

リンク

2013/2/18(Mon) 19:03:51|NO.52488

遅かった(・ω<)



hogehoge123

リンク

2013/2/18(Mon) 19:53:52|NO.52489

> すいません・・・次からはちゃんと間違いではないかどうか調べてから返信するようにします。
あ、誤解を招くような書き方でごめん。スレ主さまのことではないです。。。



GENKI

リンク

2013/2/18(Mon) 22:29:37|NO.52492

解決しているようですが、すごく気になるので。

> >>HSPでのdoubleはただ実数型なだけで範囲はintと同じだったはず
> でたらめなことを言わないでください


#include "hspmath.as" mes strf( "整数の最大値=%d", INT_MAX) ;32bit mes strf( "実数の最大値=%e", DBL_MAX) ;64bit



kanahiron

リンク

2013/2/18(Mon) 22:51:47|NO.52494

詳しくは調べなかったのですが、精度をかなり犠牲する代わりに
1797693134862315700000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000
まで表現できるんですね…恐ろしい



ONION software Copyright 1997-2021(c) All rights reserved.