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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1004
木村sortvalの動作について質問14解決


木村

リンク

2011/10/4(Tue) 20:11:16|NO.42005


#include "hspda.as" a = 0,1,-1 a=120,738209024,-1711076608 sortval a, 0 repeat length(a) mes strf("a(%d)=%d",cnt,a(cnt)) loop

 上記のスクリプトを当方の環境で流してみたところ、並び替えが起きませんでした。これは私の環境が悪いだけなのでしょうか?
 皆様の環境で正常に動くかどうかお聞かせ下さい。



この記事に返信する


にゃんちゃん

リンク

2011/10/4(Tue) 20:16:33|NO.42006

やってみましたが、ちゃんとソートされていました。なんなんだろう



木村

リンク

2011/10/4(Tue) 20:42:47|NO.42007

>>にゃんちゃん氏へ
>やってみましたが、ちゃんとソートされていました。なんなんだろう
 素早い検証ありがとうございます。やはり普通の環境なら普通に動くみたいですね。
 当方の環境だと何だか無符号数値としてソートされてるようなのです。
 とりあえず、ソートする数値の上限を2Byteに抑えてみたところ、当方の環境下でも正常に動いたので可能性としては高そうです。
 最後に改めて、検証してくださりありがとうございました。



にゃんちゃん

リンク

2011/10/4(Tue) 20:54:06|NO.42008

おかしいですね。
こちらはWindows XPですが、OSによる違いとかあるのでしょうかね?



ぬこ

リンク

2011/10/4(Tue) 21:01:47|NO.42009

win7では木村さんと同じように符号は無視されました



木村

リンク

2011/10/4(Tue) 21:58:38|NO.42011

>>ぬこ氏へ
>win7では木村さんと同じように符号は無視されました
 素早い検証ありがとうございます。
 実は当方の環境もWindows7HomePremiumでした。CPUはインテルCeleronプロセッサー723(1.20GHz)。32bitです。
 Win7環境依存な問題の目が浮かんできましたね。
 検証してくださり、ありがとうございました。



who

リンク

2011/10/4(Tue) 22:04:56|NO.42012

win7,64bit,Corei5ではおきませんでした。32bitのみのようですね。



TTRUKO

リンク

2011/10/4(Tue) 22:08:10|NO.42013

うちはWin7(32bit)のCore i3ですが
正常にソートされました〜



にゃんちゃん

リンク

2011/10/4(Tue) 22:10:26|NO.42014

もしかして、CPUですかね?
こちらは、XPですがCPUはインテルI3の3.33GHZです。



TTRUKO

リンク

2011/10/4(Tue) 22:22:32|NO.42015

あ、DLLのバージョンによって違うのかも
最新のhspda.dll(2011/9/13版)だと正常にソートされませんでした



inovia

リンク

2011/10/4(Tue) 22:23:28|NO.42016

実行したHSPのバージョンが気になりますね。

途中からsortvalのソート方法が変更になっているようなので。
http://dev.onionsoft.net/trac/changeset/439



KA

リンク

2011/10/4(Tue) 23:00:11|NO.42017

扱える数値範囲に違いが有るのでは。

D=$F : mes D D=$FF : mes D D=$FFF : mes D D=$FFFF : mes D D=$FFFFF : mes D D=$FFFFFF : mes D D=$FFFFFFF : mes D D=$FFFFFFFF : mes D D=$FFFFFFFFF : mes D D=$FFFFFFFFFF : mes D



木村

リンク

2011/10/4(Tue) 23:32:26|NO.42019

 皆様、検証やご指摘、ありがとうございます。

>>who氏へ
>win7,64bit,Corei5ではおきませんでした。32bitのみのようですね。
 検証ありがとうございます。
 今のところ、64bit環境下での不具合は聞きませんから、やはりWindows7の32Bit環境特有の現象と考えるのが自然でしょうか。
 そうなると、Windows7の32Bit環境下でも動作する代用のソートが必要になってきそうです。代用するならこちらのページのスクリプトでしょうか?
http://hspdev-wiki.net/?Sort%2FQuick

>>TTRUKO氏へ
>最新のhspda.dll(2011/9/13版)だと正常にソートされませんでした
 別バージョンのhspdaの動作検証、ありがとうございます。
 当方のバージョンは2011/01/17が最終更新日のようなので、TTRUKO氏のバージョンとは違うと思われます。
 sortval命令は比較的更新回数の多い命令ですから、そう古くない更新の一つが今回の結果を生みだしているのかもしれませんね。

>>inovia氏へ
>実行したHSPのバージョンが気になりますね。
 ご指摘ありがとうございます。
 HSP本体側のバージョンはVer3.3、HSPDAの方は2011/01/17最終更新のVer3.2です。
 基本性能に直結するHSP本体の性能向上を図る為に、敢えてHSPDAの修正は後手に回しているのかもしれないと考えると、この手の不具合も止むを得ない気がしてきました。

>>KA氏へ
>扱える数値範囲に違いが有るのでは。
 ご指摘ありがとうございます。
 HSPの整数型は符号付き32Bitなので最低でも正負双方向に約20億以上の表現域を持ちます。なので、−11億程度の数値なら十分扱えると思われます。
 ただ、hspdaを作り上げているC++では、符号の有無やBit数を任意で定義できる為、そこのデフォルト値のずれが扱える数値範囲の違いを生みだしている可能性は少なくないと思います。



inovia

リンク

2011/10/5(Wed) 00:28:48|NO.42023

OpenHSPのソースコードを見てみたところソート時の比較に減算が使われており、
例えば、
(-1711076608) - (738209024) = -2449285632
となった場合、符号ありの整数(signed int)の扱える範囲を超えてしまっています。
そのためソートがおかしくなってしまってるようです。

減算ではなく、大小で比較するようにした
hspda.dllをビルドしておきましたのでおいておきます。(ソースコードあり)
VS2008でビルドしたので、Windows 2000以上でないと実行できないかと思います。

http://tkooler.moe.hm/hsp/img/hsp33_fix_hspda_by_inovia.zip



木村

リンク

2011/10/5(Wed) 08:13:13|NO.42027

>>inovia氏へ
>OpenHSPのソースコードを見てみたところソート時の比較に減算が使われており、
>そのためソートがおかしくなってしまってるようです。
 C++側のソースコードまで分析して頂き、誠にありがとうございます。なるほど、そういう話なら納得がいきます。

>減算ではなく、大小で比較するようにした
>hspda.dllをビルドしておきましたのでおいておきます。(ソースコードあり)
 修正版hspda.dllを使ってみたところ、当方の環境下でも正常な並び替えが行われました。

 原因究明ばかりではなく、修正プログラムまで作っていただき、inovia様には感謝してもしきれません。これで索引の数を6万種類から40億種類に増やせます。
 本当にありがとうございます。



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