ab.com コミュニティ https://www.activebasic.com/forum/ |
|
指数演算の警告 https://www.activebasic.com/forum/viewtopic.php?t=2346 |
ページ 1 / 1 |
作成者: | 彦左衛門 [ 2008年3月24日(月) 18:50 ] |
記事の件名: | 指数演算の警告 |
何処に書き込むか迷いましたが、ここに。 DWordNum1 = 10 ^ DWordNum2 上記の様な指数演算にて、 [警告] DoubleからDWordに強制変換されています。データが失われる可能性があります。 と出ますが、DWord 型 とリテラル値のみの演算で上記の様な警告が出るのは、そういうものなのですか。内部の演算が Double 型で扱われている様な話は聞いていますが、プログラマーから見た場合、明らかに DWord 型 の演算なのに警告が出るのはチョット変な気がします。恐らく、DWord 型 のレベルで失われるデータは、&hFFFFFFFF を超えた場合、0 を下回った場合以外は無いのではと思います。その点に関しては、DWord 型 とリテラル値の加減算でも同じで、そちらは警告が出ませんよね。 バグではなく、警告としなければ為らない理由が在るのでしたら、教えて頂けますか。 |
作成者: | 彦左衛門 [ 2008年3月25日(火) 17:21 ] |
記事の件名: | |
使用バージョンは 4.24.00 です。 |
作成者: | イグトランス [ 2008年3月25日(火) 17:55 ] |
記事の件名: | |
たしかに警告は不自然に感じますね。整数の指数演算に関する言語の規則を決めて,警告しないようにするほうがよいと私も思います。 今の挙動がどうしてそうなのかということは山本さんでないとわからないです……。 |
作成者: | konisi [ 2008年3月25日(火) 21:45 ] |
記事の件名: | |
確かbasic/function.sbp内の関数powの仕様の関係でDouble型を返すことになってたはずです。(コンパイラ側の仕様で必ず内包される関数のひとつの筈。) グローバル領域でのオーバーロードができれば対処できるかもしれません。 どちらにしても4.24だと無理だった気がするんですが。 具体的には こんな奴 [ここをクリックすると内容が表示されます] を定義(オーバーロード)する必要があるわけです。コード: Function pow(x As Long, n As DWord) As Long Dim r As Long r=1 While n If n and 1 Then r=r*x x=x*x n=n>>1 Wend pow=r End Function 直接書き換えるとDouble型の演算がうまくいかなくなると思うのでやめておいてください。 #Fixとかは組み込むのにこいつを組み込まないのはどうしてなんでしょうねぇ・・・。 追記:山本さんが機械語を読まないのを思い出したので、組み込み用のバイナリとか作ってみました。 [ここをクリックすると内容が表示されます]
どうみても暇なだけです。 55 8B EC 53 56 8B 4D 0C B8 01 00 00 00 8B 5D 08 F7 C1 01 00 00 00 74 02 F7 EB 8B F0 8B C3 F7 E8 8B D8 8B C6 D1 E9 75 E8 5E 5B C9 C2 08 00 (46byte,呼び出し:stdcall,引数:上のコードと同一) source code [ここをクリックすると内容が表示されます] コード: pow proc x:dword,n:dword push ebx push esi ;ret=r=eax ;n=ecx ;x=ebx mov ecx,n mov eax,1 mov ebx,x _l1: test ecx,1 jz _l2 imul ebx _l2: mov esi,eax mov eax,ebx imul eax mov ebx,eax mov eax,esi shr ecx,1 jnz _l1 pop esi pop ebx ret pow endp |
作成者: | 彦左衛門 [ 2008年3月28日(金) 17:22 ] |
記事の件名: | |
konisi さん、今日は。今回も返信有難う御座います。 パッと見て解るものではないようですので、とりあえずお礼のみで。 有難う御座いました。 |
作成者: | 彦左衛門 [ 2008年3月28日(金) 17:32 ] |
記事の件名: | |
御免なさい。イグトランスさんの返信、後から気付きました。僅か三十分位の差のものでしたのに。 >>整数の指数演算に関する言語の規則を決めて,警告しないようにするほうがよいと私も思います。 ver.5 では改善されている事を願います。現状は、仕様と認識して置きます。 イグトランスさん、申し訳在りませんでした。有難う御座いました。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |