HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1015
Mituki0.2+0.2ができない(1より小さい数でrepeatではできない)16解決


Mituki

リンク

2015/10/15(Thu) 20:30:58|NO.72322

こんなのを作ってるんですが・・・

repeat redraw 0 color 255,255,255:boxf color 0,0,0 a=a+0.2 pos 0,0 mes a redraw 1 await 10 loop
これでも 0.2 なので、たぶん0と判断して+0になるのでしょう。
なのでどうすれば良いのかわかりません。質問お願いします。



この記事に返信する


ゼーット!!

リンク

2015/10/15(Thu) 20:58:17|NO.72324

1行目に
a=0.0
を入れてみるべし。



KA

リンク

2015/10/15(Thu) 21:11:13|NO.72325

理由が分かっているのに質問するのはなぜ?



pumpkin

リンク

2015/10/15(Thu) 21:23:32|NO.72326

変数には整数型、文字列型、実数型というのがありまして
0.2のような少数点を使うのは実数型になります。

違う型の変数どうしの計算は、少しクセがあるんです
a="あいうえお3" //aは文字列型
b=5 //bは整数型 c=a+b //cは文字列型になる mes c
実行すれば分かりますが、答えは「あいうえお35」になります
これは文字列型と整数型で計算したとき、自動的にbが文字列型に変化するので
「あいうえお8」にならず、ただ文字がくっついただけになってしまったのです。

これと同じで、整数型と実数型(少数)で計算すると自動的に実数型が整数型になります。
これにより、0.2が整数である0になってしまうのです。
最初に
a=0.0
と入れておけば、aが実数型になり計算できます。



Mituki

リンク

2015/10/15(Thu) 21:25:01|NO.72327

でも最後の5択が邪魔・・・



通りすがり

リンク

2015/10/16(Fri) 16:06:00|NO.72337

他の方々の回答と被り、加えて少々長文になりますがご了承ください。<br>
<br>
この問題の原因は、コンパイラの判断による「暗黙の型変換」が起きたからです。<br>
<br>

a=a+0.2
変数aをユーザー側が明示的に初期化しない場合、HSP側が自動的に整数「0」で初期化します。<br>
なので上記の式は<br>

a=0+0.2
となってしまいます。<be>
整数型の「0」と実数型の「0.2」がかち合ってしまう事になるのですが、<br>
この時に型変換が行われるのです。<br>
<br>
型変換(キャスト)とは「ある型から別の型に変わる事」で、<br>
+△箸いΨ彁擦任榔Δ劉△郎犬劉,侶燭房動的に変換されてしまいます。<br>
自動的に型変換されることを「暗黙の型変換」と言うのです。<br>
<br>
なので◆0.2」は 0」の整数型へとキャストされ、小数点以下が切り捨てられて「0」になり、<br>
掲示されたソースコードを実行した結果が「0」になったわけですね。<br>
スレタイトルから察するにrepeatに原因があるんじゃないかと思われているようですが関係ありません。<br>
<br>
解決策としては他の方が示されている通り<br>

a=0.0
このように変数aを明示的に実数型として初期化する文をrepeatより前に記述して暗黙の型変換をさせないようにするか、<br>

a=0.2+a
のように順序を入れ替えて変数aを実数型へ暗黙の型変換させてやるか、<br>

a=double(a)+0.2
double関数を用いて変数aを明示的型変換してやるか、等が考えられます。<br>



通りすがり

リンク

2015/10/16(Fri) 16:13:40|NO.72338

しまった……適度に改行云々って<br>の事じゃなかったのか……。
見難くなって申し訳ないです(´・ω・`)



pumpkin

リンク

2015/10/16(Fri) 18:53:22|NO.72339

通りすがりさん>HTMLタグ全てが使えるわけじゃないっぽいんですよね…
恐らく使える(というか使う)のはpreだけじゃないかなと思います



Mituki-WiiU

リンク

2015/10/16(Fri) 21:18:47|NO.72341

はい。わかりました。
皆さん、ありがとうございます!



Snake

リンク

2015/10/17(Sat) 16:15:59|NO.72344

通りすがりさんの通り、実数が勝手に整数に変換されているのはわかります。
けれど、xxxx.0というのは配列変数の参照でも使いますよ。
普通であれば xxxx[0]とかxxxx[1]とかで[]でくくいますが...
なので、0+0.4だと0.4の部分は0という変数の4番目の配列(正式には3番目)を参照しているように
見えました。もちろん数字のみで変数名は指定できませんし、そもそも存在しないので
0になると思ってましたが、コンパイラが原因でしょうか?
HSPでは浮動小数点による計算はできないかと思いましたがdouble関数でできるんですね。
僕も参考になりました。



KA

リンク

2015/10/17(Sat) 21:48:32|NO.72351

>>xxxx.0というのは配列変数の参照でも使いますよ
変数「名」と言うくらいだから、数字の変数名は使えませんよ?



スペース

リンク

2015/10/17(Sat) 22:16:12|NO.72352

>>KAさん
Snakeさんは数字だけが使えないのはわかってると言ってますし、
そもそも変数「名」でも全角の数字は使えますし。



通りすがり

リンク

2015/10/18(Sun) 09:28:15|NO.72359

今回の件は暗黙の型変換が原因だと見てほぼ間違いないでしょう。
まずMitukiさんが何を意図して冒頭のプログラムを書いたのか、それに注目します。

スレッドタイトルを見るにMitukiさんは
「繰り返し文の中で加算したい」と考えているという事が分かります。
そして同時に「何故か1よりも小さい実数値ではそれが出来ない」とも訴えているわけです。
つまり「1よりも小さい実数値も繰り返し加算させたい」という意図を持っていると推測出来るわけです。

ではその意図を具体的にどのようなプログラムでもって実現しようとしたのか、
それが冒頭に示されたソースコードなわけですね。

これを見ていきますと
「仮想画面を白く塗りつぶした後、変数aに0.2を加算した物を仮想画面へと書き込み、
それを実画面へ描画し、以後これを繰り返す」
というリアルタイムにカウントアップしていくプログラムである事がよく分かります。

ここでSnakeさんは0.2は配列変数の参照ではないかと疑問に思ったわけですね?
確かにKAさんやスペースさんの言う通り、
半角の数字のみ、もしくはそれから始まる変数名は使えませんが、
全角の数字は文字と見なされ「0.2」という書き方が出来ます。

ですが、ここで冒頭のソースコードの
a=a+0.2

をコピーしてメモ帳等に貼り付けて確認してみてください。 ・「0」は全角ではなく半角で書かれていますので紛れも無く実数値です。 また、最初のスレタイトルを思い出してください。 ・「加算」そして「1より小さい数」に該当するものは「0.2」の他に無いのです。 加えてMitukiさんはスレタイ及び本文の中で「配列」という語句を一切使っていません。 「語句を使っていないから配列を使っていない」とはなりませんが、 先の2つの点と合わせて考えてみれば今回の件に配列は関係ないと言えるでしょう。 以上のことから今回の件は 「変数aと0.2の型の違いに気づかず暗黙の型変換を許し、意図した処理をさせることが出来なかったのだろう」 と推理して先の回答を述べさせていただきました。 どうでしょう、ご理解いただけましたか? ホントはもう2~3点言いたいことあったんですがこれ以上長くなるのは流石に……。 そろそろ通り過ぎようと思います……。 長々と失礼いたしました(´・ω・`)



スペース

リンク

2015/10/18(Sun) 12:26:22|NO.72361

通りすがりさんの「をコピーしてメモ帳等に貼り付けて確認してみてください。」の文章を読むと、
「Snakeさん、KAさん、私(スペース)はMitukiさんの言いたいことをよく理解できていない」という前提があるように思えるのですが、
私は3人ともMitukiさんの言いたいことは理解していると思っています。
今は変数名で使える文字の議論をしていると認識していました。
もちろん、そんな議論はスレ違ですが。



通りすがり

リンク

2015/10/18(Sun) 15:24:45|NO.72363

SnakeさんはMitukiさんの意図を良く把握していなかったが為に「配列変数.要素数」を連想して、果たして本当にコンパイラが原因だったのか困惑してるのだと思われます。
これに対する回答が2番目のものです。
ここにKAさんとスペースさんは含まれていません。
「ですが」を基点とした前後の文に引っかかった様ですが、ここに「御二方がMitukiさんの問題を理解していない」という前提を含めたつもりはありません。
KAさんは0.2が実数値であると分かっていたからこそ変数名で数字は使えないと返答したのでしょう。
スペースさんも理解している上で全角文字なら数字でも変数名に使用できると示されたのですね。

ですがここでスペースさんは一つ誤認しています。
今現在問題になっているのは「変数名で使用可能な文字」ではありません、これはあくまでサブの問題です。
メインの問題は「Snakeさんの抱いている疑問に如何に理路整然と回答するか」です。
全角数字が変数名に使えると示してSnakeさんの疑問は晴れるでしょうか?
「全角数字を用いた場合は変数名に使用できる。じゃあ結局原因は一体何なんだ?」と混乱に逆戻りなのは目に見えています。
ですから「今回は(配列変数.要素数)を含めて考える事はないんですよ」と私なりの回答を示させて頂いた訳です。
至極真っ当な理由で困惑しているSnakeさんを放置して議論を別の方向に持って行った挙句、私の回答に突っかかるというのは少々いただけません。
私はHSPに関して「いろは」の「い」も知らない若輩者です。
そしてスペースさんの方が色々と熟達していらっしゃるかと思います。
ですので私の様な者の発言に囚われることなく、
私の示した回答以上に簡明な解説やその他原因となりうるモノを示してSnakeさんの助けになっていただければと思います。



スペース

リンク

2015/10/18(Sun) 16:03:04|NO.72364

私はKAさんの「変数「名」と言うくらいだから、数字の変数名は使えませんよ?」にたいしてだけ言っただけで、
Snakeさんの疑問には回答したつもりはありません。
ですが私の書き込みが話を混乱させる可能性があったのは確かです。



KA

リンク

2015/10/18(Sun) 18:56:24|NO.72367

スレ主は毎回毎回飽きもせず、ふざけた文章で質問しています。

>>0.2+0.2ができない(1より小さい数でrepeatではできない)
1以上の小数点数計算でも同じはず。
「0.2を1.2にしたらどうなるか?」、まず誰でも試すでしょう。

>>これでも 0.2 なので、たぶん0と判断して+0になるのでしょう。
そもそも0.2にはならず、いつまでやっても0のままです。

以上から察すると、「間違いに気が付いているけど質問しよう」と
いう態度が見え見えです。(批判の意図はありませんが、いつもの
態度が態度なので、こう思われても仕方がないのでは?)

--------------------------------------------------------------

>>そもそも変数「名」でも全角の数字は使えますし。
全角に当てはめた数字に見える記号文字です。
(半角英数字と別物なのは知っていると思いますが。)

ヘルプや掲示板を見ていれば「実数が使える」と言う事は
割と簡単に気が付くと思のですが、配列指定の変更を知っ
ていて小数点数に気が付かないのも変な気がします。

いつもの癖で、余計な事ばかり突っ込むのは反省しています。



ONION software Copyright 1997-2021(c) All rights reserved.