累乗計算で変数を操作した際の挙動につきまして

ホーム フォーラム CF2.5使用法全般 累乗計算で変数を操作した際の挙動につきまして

  • このトピックには6件の返信、3人の参加者があり、最後にASDにより3年、 9ヶ月前に更新されました。
7件の投稿を表示中 - 1 - 7件目 (全7件中)
  • 投稿者
    投稿
  • #33961
    Midoriko
    参加者

    度々すみません、別件です。
    2.5+ R292.22

    変数の計算につきまして、不具合と思われるほど奇妙な挙動がありますので
    ご報告も含め、ご教授頂ければ幸いです。

    プログラムを添付しました。
    オブジェクトの変数ではなくカウンターの値を使っていますが、
    変数でも同様の挙動になることは確認済みです。

    左のオブジェクトをクリックすると、
    “10 POW (クリック回数-1)”をカウンターの値に代入します。
    1,10,100,1000…とケタが増えていく形です。
    6回(10万)までは正常ですが7回(100万)で1e+06といった表記に変わります。

    正しい表記ですし値としてはちゃんと機能しているようですが、
    ここで問題なのは値をstr$()で文字列化したときに表記のまま、
    例えば左から2文字目を参照しても”0″ではなく”e”が返ってきてしまうため
    働かなくなるという点です。

    なお、右のオブジェクトをクリックし
    シンプルに100万を代入した場合は1000000という表記になります。
    (そもそも数値として充分扱える範囲のはずですので)
    しかし奇妙なのは、一度でも累乗計算で数値を変更した場合、
    直接100万を代入しようとしても1e+06という表記になります。

    おそらく意図された仕様と異なる挙動も含まれると思いますし、
    何より、文字列化して利用する前提で変数を扱うこともありますので
    そもそも1e□□表記自体、非常に困るものとなっています。

    不具合・修正要望としてご報告頂くと共に、
    累乗計算時に1e□□表記を回避する方法があれば教えて下さると幸いです。

    関連しまして質問‥と言いますか、確認させて頂きたいことがあります。
    値を文字列化せずに、任意の桁の数値を正確に抜き出す方法です。

    例えば4桁目を取得する場合、
    “値 mod 10000 / 1000″とすれば可能ですが、
    値が100のときには0ではなく0.1が返ってきてしまいます。
    そこで
    “Int(値 mod 10000 / 1000)”と小数点以下を切り捨てることで
    0が返るようにしていますが、
    あらゆるケースで問題なく、その桁の値を正確に抜き出せるか若干不安です。
    もし問題ありそうなケースが考えられましたらご指摘お願いします。

    以上長々とすみません、よろしくお願いします。

    Attachments:
    You must be logged in to view attached files.
    #33963
    noru123
    参加者

    以下に私個人で把握して多分こんな感じかな?と思ったことを書きます。
    この辺は自身の経験のうろ覚えなので他の方やASDさんの返答を待った方がいいです。確実に。

    カウンターの場合はプロパティ→設定→有効数字の数16にチェックを入れるか、カウンターの値に数値を入れるとき INTで数値を与えると正常に表記されます。整数値に丸めてもOKです。
    変数でもこうなるのはなぜかというと、powで計算した値をそのまま使うと変数が浮動小数点型になって6桁以降が指数表示になってしまいます。
    なのでpowで計算した値を整数に丸めるか、INTで整数にしないといけません。
    整数に丸めたりINTで変換すると、4バイトまで使用できます。

    以上全部予想です。

    #33964
    noru123
    参加者

    一応補足です。
    プログラム言語には変数の型というのがあって、変数の型の種類はいろいろあるんですが、CF2.5で数字の場合の変数型は小数点つきか整数のみかの2種類になります。
    一度小数点込みで変数を初期化すると、その変数はずっと小数点ありを扱う変数になってしまい、6桁を超える値を入れてしまうと指数表示になります。
    こうなると変数は整数型には戻れません。フレーム移動で初期化できれば大丈夫ですけどね。
    だから整数が必要な場合は、事前に小数点が入らないように式を作るか、小数点をどうにかして整数に丸めるかしなければなりません。
    でもPOWを使うと戻ってくる値が整数に見えても値を入れる変数が小数点付き型になるので、Int(10 pow 変数 A( “アクティブ” ))のようにしたり、シーリング値やフロアー値などで囲んで整数型の答えにして変数に入れなければなりません。

    #33965
    Midoriko
    参加者

    ご回答ありがとうございます!
    な、なるほど‥プログラム言語レベルのちゃんとした仕様なんですね。
    しっかり勉強したことは無かったので「変数の型」というのを初めて知りました。

    仰ること難しかったですが、なんとか全部理解できたと思います。

    今回のケースのポイントは、一旦小数点以下を返させてしまうと
    その変数は「小数点を扱うタイプの変数」になってしまうこと、
    POW を使うと返ってくるのは整数でも同じく少数点タイプになること、
    回避するためには小数点を返させないような式が必要となること、ですね。

    試しにInt()で小数点以下破棄したら整数のままケタを増やすことができました。

    わたしの中では解決いたしましたが、他の方の回答を待ったほうが良いとのことなので
    もし他にご指摘等あればぜひお願いいたします。

    改めてありがとうございました、助かります。

    #33966
    noru123
    参加者

    お役に立てれば幸いです。
    しかし、私の答えは確定したものや公式のものではなくて、私が感覚的にCf2.5を使ってきて、だいたい仕様はこんな感じかな?と私的に思っている内容でしかないので、どこか、または全部が間違っている可能性はおおいにありますのでやはり注意は必要です。

    #33967
    Midoriko
    参加者

    補足ありがとうございます、了解しました。
    とりあえず私的な理解としてとどめておきますね。
    また何かありましたらよろしくお願いします。

    #33975
    ASD
    キーマスター

    noru123様、ご回答頂きありがとうございました。私も本職のプログラマでもなければCFの作者でもないので、確定的なことは言えませんが、ほぼnoru123様の説明通りだと思います。

7件の投稿を表示中 - 1 - 7件目 (全7件中)
  • このトピックに返信するにはログインが必要です。