作成者 |
メッセージ |
|
|
ありがとうございます、イグトランス様
> これは様々な言語で良く見かける仕様です。
> 特にx86系CPUではCPU内部での浮動小数点数の演算時には全て80bit拡張倍精度が使われるため,
> これに合わせる仕様の言語が大変多いです。
すみません、表現のしかたを間違っていました。
むしろ、私が言いたかったのは同じ演算結果のはずのものが(3*(6/5))違っていたのを伝えたっかたのです( 3.600000 と 3.599999 )。
ありがとうございます、イグトランス様
> これは様々な言語で良く見かける仕様です。 > 特にx86系CPUではCPU内部での浮動小数点数の演算時には全て80bit拡張倍精度が使われるため, > これに合わせる仕様の言語が大変多いです。
すみません、表現のしかたを間違っていました。 むしろ、私が言いたかったのは同じ演算結果のはずのものが(3*(6/5))違っていたのを伝えたっかたのです( 3.600000 と 3.599999 )。
|
|
|
投稿記事 |
Posted: 2006年1月03日(火) 08:51 |
|
|
|
|
|
> もうひとつ、代入先の変数を実数型(Single)にして見ると比較や表示の部分ではDoubleになっているようです。
これは様々な言語で良く見かける仕様です。
特にx86系CPUではCPU内部での浮動小数点数の演算時には全て80bit拡張倍精度が使われるため,
これに合わせる仕様の言語が大変多いです。
ただ表示(Print)は単に現在のABは関数のオーバーロードがサポートされていないので,
数値型の引数は全てDoubleで受けているだけのことです。
> もうひとつ、代入先の変数を実数型(Single)にして見ると比較や表示の部分ではDoubleになっているようです。
これは様々な言語で良く見かける仕様です。 特にx86系CPUではCPU内部での浮動小数点数の演算時には全て80bit拡張倍精度が使われるため, これに合わせる仕様の言語が大変多いです。
ただ表示(Print)は単に現在のABは関数のオーバーロードがサポートされていないので, 数値型の引数は全てDoubleで受けているだけのことです。
|
|
|
投稿記事 |
Posted: 2006年1月03日(火) 08:23 |
|
|
|
|
|
お答えいただけなかったので、もう一度報告いたします。
整数リテラル値同士の除算(/)は整数除算がされていますが、整数型変数同士の除算(/)は実数除算がされています。
Ver4.1β1で
・整数同士で"/"演算子を扱うと、"\"演算子と同様、つまり、整数除算が行われるようにしました
と言うことなので、整数型変数同士(整数型リテラル値と整数型変数も)の除算も整数除算をしてもらいたいです。
それと、SingleからLongへの強制変換を四捨五入でしているようですが、切捨てにできないでしょうか?(キャストしてやると切捨てされるのでキャストすれば良いのですが)
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: #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
もうひとつ、代入先の変数を実数型(Single)にして見ると比較や表示の部分ではDoubleになっているようです。
確認してもらえたらと思います。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: #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
AB Ver4.13.00(2005 Final)で確認しました。
お答えいただけなかったので、もう一度報告いたします。
整数リテラル値同士の除算(/)は整数除算がされていますが、整数型変数同士の除算(/)は実数除算がされています。
Ver4.1β1で [u]・整数同士で"/"演算子を扱うと、"\"演算子と同様、つまり、整数除算が行われるようにしました[/u] と言うことなので、整数型変数同士(整数型リテラル値と整数型変数も)の除算も整数除算をしてもらいたいです。
それと、SingleからLongへの強制変換を四捨五入でしているようですが、切捨てにできないでしょうか?(キャストしてやると切捨てされるのでキャストすれば良いのですが)
[hide][code]#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 [/code][/hide] もうひとつ、代入先の変数を実数型(Single)にして見ると比較や表示の部分ではDoubleになっているようです。 確認してもらえたらと思います。
[hide][code]#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 [/code][/hide] AB Ver4.13.00(2005 Final)で確認しました。
|
|
|
投稿記事 |
Posted: 2006年1月03日(火) 01:12 |
|
|
|
|
|
プログラミング質問版で質問していたのですが、整数同士の除算が実数で演算されているようです。
仕様では実数型への代入時には実数除算がされるとなっているのですが整数型のときも実数除算がされています。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード:
#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
プログラミング質問版で質問していたのですが、整数同士の除算が実数で演算されているようです。
仕様では実数型への代入時には実数除算がされるとなっているのですが整数型のときも実数除算がされています。
[hide][code] #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 [/code][/hide]
|
|
|
投稿記事 |
Posted: 2005年12月13日(火) 23:13 |
|
|
|
|