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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0910
C.Plughspmathのlog10は丸め誤差が発生します2解決


C.Plug

リンク

2018/9/10(Mon) 20:06:01|NO.85318

先日、与えられたintの桁数を調べる必要があり、以下のコードを実行しました。次の例は1000に対して実行したものです。


#include "hspmath.as" value = 1000 mes floor(log10(value)) + 1

これを実行したところ、4.000000と出るべきところが3.000000と出ました。

hspmath.as を確認したところ、log10は


#define ctype log10(%1) (logf(%1)/logf(10)) ; log_10(x)

という実装(底の変換)になっていましたが、ここで丸め誤差が発生したと考えられます。


mes log10(1000) // -> 3.000000 mes floor(log10(1000)) // -> 2.000000

log10の定義に使われたlogfの実装がどのようなものかは確認できませんでしたが(おそらく直接log(x)を呼び出している?)、
このlog10を底の変換を介さずにmath.hのlog10(float x)を直接呼ぶ標準関数にすることは可能でしょうか?



この記事に返信する


inovia

リンク

2018/9/10(Mon) 22:27:38|NO.85319

ひどい回避策。


#include "hspmath.as" #undef log10 #module #uselib "msvcrt" #cfunc _log10 "log10" double #uselib "kernel32" #func VirtualProtect "VirtualProtect" var,int,int,var #define xdim(%1, %2) dim %1, %2 : VirtualProtect %1, %2*4, $40, AZSD #defcfunc log10 double x if (pFunc == 0){ xdim pFunc, 9 pFunc(0) = 0x8bec8b55, 0xec830c45, 0x100ff208, 0x110ff200 pFunc(4) = 0x55ff2404, 0x08c48308, 0xdd0c4d8b, 0x5dc03319, 0x000008c2 prm(0) = varptr(_log10) } _x = x : prm(1) = varptr(_x) _d = callfunc(prm, varptr(pFunc), 2) return _x #global value = 1000 mes floor(log10(value)) + 1



ritu

リンク

2018/9/11(Tue) 08:00:20|NO.85320

過去ログ
http://hsp.tv/play/pforum.php?mode=pastwch&num=9727
のNO.9784に少数の戻り値を取得する方法があるのでそれを使ってランタイムライブラリを呼び出せばいいと思います。



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