ab.com コミュニティ https://www.activebasic.com/forum/ |
|
整数同士の除算 https://www.activebasic.com/forum/viewtopic.php?t=555 |
ページ 1 / 1 |
作成者: | EIJI [ 2005年12月13日(火) 23:13 ] |
記事の件名: | 整数同士の除算 |
プログラミング質問版で質問していたのですが、整数同士の除算が実数で演算されているようです。 仕様では実数型への代入時には実数除算がされるとなっているのですが整数型のときも実数除算がされています。 [ここをクリックすると内容が表示されます]
コード: #include "cons2.idx" #console ' ↓ ここからプログラムが実行されます dim a As Long dim b As Long dim i As Long dim j As Long for i = 1990 to 2010 for j = 1 to 12 a = getweekday1( i, j, 1) b = getweekday2( i, j, 1) if a<>b then print i,j,a,b Next j Next Sleep(5000) end function getweekday1(year As Long, month As Long, date As Long) As Long if month < 3 then month = month + 12 year = year - 1 end if getweekday1 = ( year + year \ 4 - year \ 100 + year \ 400 + (13 * month + 8) \ 5 + date) mod 7 End Function function getweekday2(year As Long, month As Long, date As Long) As Long if month < 3 then month = month + 12 year = year - 1 end if getweekday2 = ( year + year / 4 - year / 100 + year / 400 + (13 * month + 8) / 5 + date) mod 7 End Function |
作成者: | EIJI [ 2006年1月03日(火) 01:12 ] |
記事の件名: | |
お答えいただけなかったので、もう一度報告いたします。 整数リテラル値同士の除算(/)は整数除算がされていますが、整数型変数同士の除算(/)は実数除算がされています。 Ver4.1β1で ・整数同士で"/"演算子を扱うと、"\"演算子と同様、つまり、整数除算が行われるようにしました と言うことなので、整数型変数同士(整数型リテラル値と整数型変数も)の除算も整数除算をしてもらいたいです。 それと、SingleからLongへの強制変換を四捨五入でしているようですが、切捨てにできないでしょうか?(キャストしてやると切捨てされるのでキャストすれば良いのですが) [ここをクリックすると内容が表示されます]
もうひとつ、代入先の変数を実数型(Single)にして見ると比較や表示の部分ではDoubleになっているようです。コード: #include "cons3.idx" #prompt ' ↓ ここからプログラムが実行されます dim a(10) As Long dim c As Long dim d As Long dim i As Long dim str As String ' a(1)=1,a(2)=2・・・a(10)=10 for i=1 to 10 a(i) = i Next 'どちらも3*(6/5) c = 3 * ( a(6) / a(5) ) d = 3 * ( 6 / 5 ) if c = d then print "おなじ値です",c,d else print "ちがう値です",c,d print "何かキーを押してください" str = Input$(1) end 確認してもらえたらと思います。 [ここをクリックすると内容が表示されます]
AB Ver4.13.00(2005 Final)で確認しました。
コード: #include "cons3.idx" #prompt ' ↓ ここからプログラムが実行されます dim a(10) As Long dim c As Single dim d As Single dim i As Long dim str As String ' a(1)=1,a(2)=2・・・a(10)=10 for i=1 to 10 a(i) = i Next 'どちらも3*(6/5) c = 3 * ( a(6) / a(5) ) d = 3 * ( 6 / 5 ) if c = d then print "おなじ値です",c,d else print "ちがう値です",c,d print "何かキーを押してください" str = Input$(1) end |
作成者: | イグトランス [ 2006年1月03日(火) 08:23 ] |
記事の件名: | |
> もうひとつ、代入先の変数を実数型(Single)にして見ると比較や表示の部分ではDoubleになっているようです。 これは様々な言語で良く見かける仕様です。 特にx86系CPUではCPU内部での浮動小数点数の演算時には全て80bit拡張倍精度が使われるため, これに合わせる仕様の言語が大変多いです。 ただ表示(Print)は単に現在のABは関数のオーバーロードがサポートされていないので, 数値型の引数は全てDoubleで受けているだけのことです。 |
作成者: | EIJI [ 2006年1月03日(火) 08:51 ] |
記事の件名: | |
ありがとうございます、イグトランス様 > これは様々な言語で良く見かける仕様です。 > 特にx86系CPUではCPU内部での浮動小数点数の演算時には全て80bit拡張倍精度が使われるため, > これに合わせる仕様の言語が大変多いです。 すみません、表現のしかたを間違っていました。 むしろ、私が言いたかったのは同じ演算結果のはずのものが(3*(6/5))違っていたのを伝えたっかたのです( 3.600000 と 3.599999 )。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |