ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
EIJI
記事: 25 登録日時: 2005年9月17日(土) 13:15
お住まい: 香川
#1
投稿記事
by EIJI » 2005年12月04日(日) 07:09
C言語の関数を移していて期待通りの値が得られなかったので調べてみたのですが、整数同士の演算についても実数演算が行われているようです。
これはActiveBasicの仕様でしょうか?
ちなみに、移していたのはこれです。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
function getweekday(year as long, month as long, date as long) as long
if month < 3 then
month = month + 12
year = year - 1
end if
getweekday = ( year + year / 4 - year / 100 + year / 400 + (13 * month + 8) / 5 + date) mod 7
End Function
/* こちらと同じ計算結果を期待していたのですが。
function getweekday(year as long, month as long, date as long) as long
if month < 3 then
month = month + 12
year = year - 1
end if
getweekday = ( year + Int(year / 4) - Int(year / 100) + Int(year / 400) + Int((13 * month + 8) / 5) + date) mod 7
End Function
*/
ちょうど、違った計算結果が出てきたので対処できました。
イグトランス
記事: 899 登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:
#2
投稿記事
by イグトランス » 2005年12月04日(日) 08:56
除算のことですよね。
/は実数除算,\が整数除算というように2つの演算子が存在しています。
\演算子の結果はもちろん切捨てされます。
なので\演算子を使ってみてください。
EIJI
記事: 25 登録日時: 2005年9月17日(土) 13:15
お住まい: 香川
#3
投稿記事
by EIJI » 2005年12月04日(日) 09:08
イグトランス様ありがとうございます。
了解しました。的外れな質問もあると思いますがよろしくお願いします。
河川屋
#4
投稿記事
by 河川屋 » 2005年12月13日(火) 02:06
>除算のことですよね。
>/は実数除算,\が整数除算というように2つの演算子が存在しています。
>\演算子の結果はもちろん切捨てされます。
そういうことはどこにも書かれていません。
整数のみ演算の場合、
/でも¥でも、どちらでも同じす。 少なくとも、N88BASICやQuickBasicは
そう動作します。
PC9821にて確認済。
で、Abの場合。ヘルプより。
>"a/b" など、ある演算における2つの値a、bが、共に符号無し変数
>(DWord型、Word型など)であるか、0以上のリテラル値であると、
>符号無し演算が行われます。それ以外は、すべて符号あり演算となります。
>1つの演算子において、符号あり、符号無しの値が与えられると、
>符号あり演算が行われます。
こう書いてある以上明白ですね。"a/b"で、a,bとも整数であれば整数の除算です。
すなわち、"a/b"で、a,bとも整数であれば、a/bとa\bは同じ演算である、
と言っているに等しいです。(符号あり演算とは整数演算のことであり実数演算のことではない、
という立場に立つ。私みたいな、技術計算屋は当然そう解釈する。)
よって、マニュアルどおりの動作をしていないという理由で、これはバグです。
Sinryow
記事: 141 登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:
#5
投稿記事
by Sinryow » 2005年12月13日(火) 07:57
ABの除算の仕様は何度か変更されているのですが,バージョンアップ履歴より
Ver4.1β1 2005/8/18
・整数同士で"/"演算子を扱うと、"\"演算子と同様、つまり、整数除算が行われるようにしました。
Ver4.11.01 2005/11/16
・実数型に整数型同士のリテラル値の除算を行ったときに、実数演算が行われるように改良。
EIJIさんの例では整数除算の結果を実数型にではなく整数型に代入するケースなので,整数除算がされなければならないのでこれはバグということになりますね。
' ============================================================
' Sinryow Game Home Page -
http://www.sinryow.net/
' Sinryow ActiveBasic Center -
http://ab.sinryow.net/
' ============================================================
EIJI
記事: 25 登録日時: 2005年9月17日(土) 13:15
お住まい: 香川
#6
投稿記事
by EIJI » 2005年12月13日(火) 23:19
河川屋様、Sinryow様ありがとうございます。
自分はVer4.11.03を使っていたのでVer4.12.01でも同じことを確認してバグ報告を入れておきました。
イグトランス
記事: 899 登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:
#7
投稿記事
by イグトランス » 2005年12月13日(火) 23:58
> >除算のことですよね。
> >/は実数除算,\が整数除算というように2つの演算子が存在しています。
> >\演算子の結果はもちろん切捨てされます。
> そういうことはどこにも書かれていません。
たしかにそうです。
\演算子の結果が切り捨てられるのは自分で試した結果です。
/演算子が実数除算と書いたのは\演算子が整数除算である以上
それに対するものとして/演算子は実数除算しかないだろうという
思い込みが入っていました。
> 私みたいな、技術計算屋は当然そう解釈する。)
> よって、マニュアルどおりの動作をしていないという理由で、これはバグです。
こういった姿勢は見習わなければなりませんですね。
ABは今回のようにヘルプが実装に追いついていないことが多いので,
ヘルプは正直あまり信用していません。気になることは自分で実験してみます。
その結果が妥当だと思えばそれで納得して使っていました。
最初の返信もヘルプはきちんと読んでいませんでした。
以後気を付けます。
マティ
記事: 161 登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:
#8
投稿記事
by マティ » 2005年12月14日(水) 10:01
Helpです を修正した際の仕様変更ではないでしょうか?
EIJI
記事: 25 登録日時: 2005年9月17日(土) 13:15
お住まい: 香川
#9
投稿記事
by EIJI » 2005年12月14日(水) 20:48
ありがとうございます、マティ様。
Ver4.11.02とVer4.10.02で試したのですが同じでした。
バグ報告に入れたコードの mod を除けてコンパイルすると除算(/)のほうに "[警告] SingleからLongに強制変換されています。" と出るので イグトランス様が言われたように "ヘルプが実装に追いついていないことが多いので" ということかもしれません。