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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0820
Slimepowfについて19解決


Slime

リンク

2011/8/20(Sat) 16:52:34|NO.40707

2の累乗をpowfを使って求め,intを使い整数に直したら
値が狂ってしまいました(3乗6乗12乗のときなど)


b = 3 a = powf(2,b) a = int(a) mes a

↑の間違い,またはスマートに2の累乗を求める方法あったらよろしくお願いします
なんか変なこといっていたらすみません



この記事に返信する


k5342

リンク

2011/8/20(Sat) 17:32:33|NO.40708

えーと、powfという命令は初めて聞いたんですけど、とりあえずHDLで調べました。

2の累乗が出したいんですよね??

例として2の3乗(=2*2*2=4*2=8)を求める命令を書くと、
b=3
a=powf(2,b) mes a

となります。
実行してもきちんと2の3乗が表示されるはずです。


>>値が狂ってしまいました
どのように狂ったのでしょうか

質問者さんの「値が狂った」とは数値の後ろに「.000000」が表示されるということでしょうか、
それならば、3行目に a=1*a を追加して、
b=3
a=powf(2,b) a=1*a mes a
としてやれば、aに「8」が代入されるはずです。




Slime

リンク

2011/8/20(Sat) 17:44:07|NO.40709

すみません
値が狂ったと言うのは7(3乗の場合)になったと言うことです。
これはint命令で整数にすると起こります。
k5342さんのスクリプトではint命令が使われていないので8.000000になります(上のスクリプト)
また a = 1 * a をしても7になりました(下のスクリプト)
説明不足でしたすみません。



k5342

リンク

2011/8/20(Sat) 17:57:56|NO.40710

え。そうですか...

下のスクリプトでも結果は同じですか?
正しければ7の3乗(343)になるはずなんですが...
b = 3
a = powf(7,b) mes 1*a



Slime

リンク

2011/8/20(Sat) 18:06:54|NO.40711

342になりました。
ただ mes 1*a を mes a にすると 343.000000 となります。
値が正しいものも多くありますが
下で挙げたものや,はじめに挙げたものも int や 1*a とすると値が狂います(たぶん1減る)

また
2の6乗は63  (正しくは64)
2の12乗は4095(正しくは4096)
になりました。



たんす

リンク

2011/8/20(Sat) 18:11:36|NO.40713

うちの環境でも8.0→7になりました。
一度文字列型にすると8になるんですけどね。

k5342さんのスクリプトに追加すると、
b = 3
a = powf(7,b) //表示結果 mes str(a) //343.000000 mes int(a) //342 mes 1*a //342
こんな感じです。

OSが64bitだからかな?



Cookies

リンク

2011/8/20(Sat) 18:15:08|NO.40714

7になりました。
デバッグウィンドウを起動して、
メモリダンプしてみてください。aを。
それから、

d = 8.0
という記述をして、このdもまたメモリダンプを見てみてください。
内容が違うでしょう?
a = FD FF FF FF FF FF 1F 40
d = 00 00 00 00 00 00 20 40
となりました。
a = 1111110111111111111111111111111111111111111111110001111101000000
d = 0000000000000000000000000000000000000000000000000010000001000000
これをビッグエンディアンにすると、
a = 01111111 | 11111111 | 11111111 | 11111111 | 11111111 | 11111111
d = 00000000 | 00000000 | 00000000 | 00000000 | 00000001 | 00000001
です。
doubleがたについては、
http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html#double
でも参考にしてください。

説明したいのですが、少々お時間を。今頭がこんがらがってます。



k5342

リンク

2011/8/20(Sat) 18:16:21|NO.40715

えぇええええええッ!

自分の環境は
Windows 7 (x64) Home
Intel core-i5 2410M
ですが、結果は343になりました。

OSとかCPUとかが関係してるんでしょうか。



Cookies

リンク

2011/8/20(Sat) 18:17:30|NO.40716

あ、大分適当でしたね。
aのビッグエンディアン化した二進数表記が…ひどい。
正しくは
0111111111111111111111111111111111111111111111111111010000000001
ですねw



inovia

リンク

2011/8/20(Sat) 18:18:11|NO.40717

もう一つの掲示板に同じような書き込みがありましたので紹介しておきます。

HSP beta-BBS 3rd / onion software - 理解できない計算結果を出力して困っています。
http://www.onionsoft.net/hsp/beta/betabbs.cgi?mode=allread&no=8580&page=



Slime

リンク

2011/8/20(Sat) 18:19:15|NO.40718

あ、ほかの人の環境でもそうなりますか…
一応安心しました。

あの, powf や pow を使わずスマートに2の累乗を求める方法
もしくは値が狂わない方法,なにかありませんか。
何かあったらよろしくお願いします。



k5342

リンク

2011/8/20(Sat) 18:19:43|NO.40719

先ほどのレスに追加。
>>また
>>2の6乗は63  (正しくは64)
>>2の12乗は4095(正しくは4096)
>>になりました。

上の命令を試してみた結果。
また
2の6乗は64→正解○
2の12乗は4096→正解○

こんな漢字です。
環境にもよるのでしょうねえええ↓



Cookies

リンク

2011/8/20(Sat) 18:22:47|NO.40720


#module #defcfunc ruijou int soko, int sisuu if sisuu = 0 : return 1 result = soko repeat sisuu - 1 result *= soko loop return result #global mes ruijou(2, 3)
これでどう?



Cookies

リンク

2011/8/20(Sat) 18:25:07|NO.40721

あーやっぱり。
累乗の底は"てい"って読むんですね。。
なんとなくそんな気はしてたけど…
ごめんなさい。



Slime

リンク

2011/8/20(Sat) 18:27:10|NO.40722

Cookiesさん、ありがとうございます。
ほかの人も、ありがとうございました。



Slime

リンク

2011/8/20(Sat) 18:28:50|NO.40723

また、ほかの方法を思いついた人お願いします。
本当にありがとうございました。



たんす

リンク

2011/8/20(Sat) 18:33:51|NO.40726

Slimeさんの環境でも通用するかは分かりませんが、

b = 3 a = powf(2,b) a = int(str(a))//一度文字列型にしてから整数型に変換 mes a
うちではこれで-1されない値が得られます。



レノス

リンク

2011/8/20(Sat) 18:36:28|NO.40727

Slime さんの HSP は最新版ではないのでは?

http://www.onionsoft.net/wp/archives/516
> powf関数がマクロから標準の実装に切り替えられ、より正確な値を返します



Slime

リンク

2011/8/20(Sat) 18:58:20|NO.40731

>>たんすさん
ありがとうございます。
>>レノスさん
すみません。そうみたいでした。^^;
最新版では修正されているようです。
たんすさんも確認してみてはいかがですか?



たんす

リンク

2011/8/20(Sat) 19:18:32|NO.40732

使っていたのはHSP3.2でした。
自分で使うツールしか作っていないのでバージョン気にしてませんでしたねぇ。



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