ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
-
jacoby
#1
投稿記事
by jacoby »
ver 4.04を使っています。
Double型への値の代入について教えて下さい。
Double型の変数Dに下のように値をセットしました。
コード: 全て選択
#prompt
Dim D As Double
D=2147483647+1
Print "D=";D
このとき表示される値は、
2147483647+1=「2147483648」
だと思ったのですが、
実際の実行結果は
「-2147483648」
と符号が負になってしまいます。
仮に代入時に
D=2147483648 と入れればもちろん
そのまま正の数として表示されます。
Long型ならこのような実行結果になっても分かるような
気はするのですが。
Double型でどうしてこうなるのか分からないでいます。
お知りの方がおられましたらよろしくお願いします。
-
NoWest
- 記事: 264
- 登録日時: 2005年5月31日(火) 10:52
- お住まい: 高知
-
連絡する:
#2
投稿記事
by NoWest »
最新版をお使いください。
現在最新のバージョンは4.20です。
-
jacoby
#3
投稿記事
by jacoby »
NoWestさん、レスありがとうございます。
HPから新しいバージョン(ver4.13)をダウンロードして実行してみたら
代入の結果はうまく「2147483648」と表示されました。
(ver4.20を、とも思ったのですが、「64ビットコンパイラ」ということで
よく分からないのですが自分の環境(WinMe)で使えるのかなとちょっと
躊躇してしまって・・)
代入結果は正しく表示されているので改めてこれを使っていきたいと
思っています。
ありがとうございました。
返信遅れてすみません。またよろしくお願いします。
-
jacoby
#4
投稿記事
by jacoby »
それが、、、
ver4.13では今までver4.04で作ったプロジェクトは上手く実行
されないみたいで。
ver4.04で青や黄色の四角を描いていたものがver4.13では
真っ白になってしまったり、TextOutで表示される文字フォントや
その大きさが変わってしまったり。場合によってはデバッグ実行の
速度がかなりゆっくりになってしまったり。
ver4.04とver4.13は少し違うみたいですね。
困ったのは一度ver4.13で開いたものを再びver4.04で
開こうとすると、「プロジェクトが壊れています」。
ファイルのバックアップを取ってからやるべきだったと反省しつつ、
困ったなー、と。
(開けなくなったものは全て別のテキストエディタで開いて
そこから改めてver4.04で新規作成のプロジェクトにコピーして
復旧出来ました。)
今HPのバージョンアップの履歴を見ながらどうしようか
あれこれ考えてはいるのですが、ちょっと当面バージョンの更新は
待った方がいいのかなと思っています。
そもそもの質問だったDouble型への値の代入については
なんとかプログラムの組み方で乗りれればと考えています。
バージョンアップはもっと慎重にやらないと、バックアップくらい
取っとかんとダメですね。
いずれにしても、ありがとうございました。またよろしくお願いします。
-
Yoshi
- 記事: 27
- 登録日時: 2005年5月31日(火) 22:17
- お住まい: 山口
-
連絡する:
#5
投稿記事
by Yoshi »
>
コード: 全て選択
> #prompt
>
> Dim D As Double
>
> D=2147483647+1
>
> Print "D=";D
>
>
> このとき表示される値は、
> 2147483647+1=「2147483648」
> だと思ったのですが、
> 実際の実行結果は
> 「-2147483648」
> と符号が負になってしまいます。
>
> 仮に代入時に
> D=2147483648 と入れればもちろん
> そのまま正の数として表示されます。
>
> Long型ならこのような実行結果になっても分かるような
> 気はするのですが。
Ver4.20を使っても同じことです。
例えば
コード: 全て選択
#prompt
Dim D As Double
D = 18446744073709551616 + 1
Print "D=";D
とすれば希望(?)の結果は得られないでしょう。
(変わったことは,64bitで計算しているので桁あふれが先に伸びただけのことです。)
なぜなら、
先に,2147483647+1がLong型として計算されます。
ご存知のとおり、2の補数表現では
&h00000000 0
&h00000001 1
:
:
&H7FFFFFF 2147483647
&H70000000 -2147483648
&H70000001 -2147483647
:
&HFFFFFFFF -1
と符号化されています。
ですから当然、
2147483647+1 が -2147483648 になるのは正しい結果です。
2147483647+1をdouble型で計算したい場合は、
2147483647.0 + 1
2147483647 + 1.0
2147483647.0 + 1.0
または、As doubleで型変換をしてください。
4.04では実装されていませんが、
#strict
をつけるなら、
データが失われる危険があることを、コンパイラーが警告します。
今日も元気にABLife
-
jacoby
#6
投稿記事
by jacoby »
レスありがとうございます。
Ver4.20を使っても同じことです。
なぜなら、
先に,2147483647+1がLong型として計算されます。
自分がver4.13で試したところでは
2147483647+1で「2147483648」を返してくれたので
ここのところの動作の違いは厳密には
まだ僕には分からないままです。
それから、
2147483647+1をdouble型で計算したい場合は、
2147483647.0 + 1
2147483647 + 1.0
2147483647.0 + 1.0
または、As doubleで型変換をしてください。
方法を教えていただいてどうもです。
確かにver4.04でも上のやり方で、「2147483648」を
返してくれました。
色々試して、使ってみたいと思います。
ありがとうございました。