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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0730
Ryuihsp3dishにおけるpowf関数のバグ(?)4解決


Ryui

リンク

2017/7/30(Sun) 01:01:02|NO.80747

hsp3dishを用いてAndroidのアプリ開発をしているときにたまたま見つけました。

#include "hsp3dish.as"
#undef mes
#define mes(%1,%2) pos 0:mes@hsp ""+%1+"="+%2+":",1:mes@hsp "int("+%1+")="+int(%2)
redraw 0:color 255,255,255:boxf:color 0,0,0
repeat 30
n(cnt)=powf(cnt,1)
mes "n("+cnt+")",n(cnt)
loop
redraw 1

これは0の1乗から29の1乗を実数と整数で表すプログラムです。
これをパソコンや手元のXperia Z5c(Android 5.1)で動かしたときは普通に動いたのですが、同じものをXperia Z1f(Android 4.2.2)で動かしたところ、
n(3)=3.000000:int(n(3))=2
と表示されました(他の数字は正しく表示されていた)。
これはバグなのでしょうか?それともこちらの端末側に何か問題が...?

開発環境は以下の通りです↓
OS:Windows7 Ultimate 64bit SP1
HSP:3.5beta
JDK:1.8.0_141
SDK:25.2.5
NDK:r12b
ANT:1.10.1
API level:21(Android 5.0.1)

どなたか検証のほどよろしくお願いします。



この記事に返信する


沢渡

リンク

2017/7/30(Sun) 14:07:26|NO.80756

以下のスレはdish環境ではなく通常のHSP環境での話ですが、やはり環境によってはpowfで誤差が生じるようです。
http://hsp.tv/play/pforum.php?mode=pastwch&num=40707

実数は内部では「1.XXXXに、2の何乗を掛けた数値」という形で表現されていて、
本来想定している数値に比べてどうしても微細な誤差が生じるようです。
その誤差のせいで予想外の事態に……ということもあり得るのではないかと思います。

べき乗計算を整数限定で行いたいのなら、以下のような関数を作ると良いかもしれません。
整数限定なので、あまり大きな数値は扱えませんが。

#module #defcfunc powi int p_a,int p_b if p_b<0 : return 0 res=1 repeat p_b res=res*p_a loop return res #global



KA

リンク

2017/7/30(Sun) 16:05:47|NO.80765

実数を使う場合は「正確な値」ではなくて、「極めて正確に近い値」
として扱いましょう。4の平方根が2では無く1.9999999と
なっても実数的には問題有りません。

整数変換は切り捨てが基本なので、この場合は1に成ってしまいます。
四捨五入的に扱いたいのなら+0.000005した上で変換する等
の細工が必要です。



Ryui

リンク

2017/8/2(Wed) 09:03:14|NO.80804

お二人ともお返事ありがとうございます。
dishに限らず他の環境でもこのようになり得るとは思わず、勝手にdishのバグかと思い込んでしまいました...。
もっと自分で調べてから書き込むことを心がけます。

整数と実数ではメモリー内での数字の保持の仕方が異なるんですね。勉強になりました。
今後実数を扱うときはそのことを意識してプログラムを組みたいと思います。

それにしても環境によってちゃんと表示できたりできなかったりするのは、何が原因なんでしょう...?



沢渡

リンク

2017/8/2(Wed) 12:27:52|NO.80805

>環境によってちゃんと表示できたりできなかったりするのは、何が原因なんでしょう...?
これはマイクロソフトの資料ですが、浮動小数点(実数)演算はCPUに搭載されている
FPUという機構に任せているそうで、CPUやFPUの仕様が違うと演算結果も微妙に変わるようです。
https://blogs.msdn.microsoft.com/jpvsblog/2014/10/28/93/
「実数演算は再現性が高くなく、厳密な計算には向かない」ということは
頭に置いておいた方が良いかもしれません。



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