Targeted JSON Pointer: Retrieve the Data as a Numeric Type


using Targeted JSON Pointer..

ASTER::EXPRESSION::JSON::Targeted JSON Pointer: Get as a value of numeric

事前にターゲット指定されたパスにある JSON 配列から、指定した配列要素のデータを「数値型」で取得。


Boolean 型を数値型にキャストした値として取得できます。

{

    "example":
    [
        true, 
        false
    ]
}
真偽値 数値へ変換後の値
true 1
false 0

文字列型として登録されているデータも可能な限り数値として取得します。


数値型は JSON の仕様だと整数 ( int )、浮動小数点数 ( double ) ですが、ASTER と CF25 で相互に値を送信する場合、CF25 の仕様に合わせて浮動小数点数型は float までのサポートになります。

float 型は整数部と小数点数部を合計して 7 桁までの数値を表現可能です。実用上の問題は無い精度ですが、表現可能な範囲は double 型と比較するとかなり狭くなります。

signed int 型の上限は ±2,147,483,647 を確認してあります。


Parameter

以下 JSON データがメモリ上に展開されているという前提で、配列要素を指定

{
    "numeric":
    [
        [
            -100,
            "2147483647",
            19.0E-2,
            19.0E-5,
            19.0E-6,
            true
        ]
    ]
}
"/numeric/0"
0
ExNumAsTgtArIdx( "ASTER", 0 )
argument result Details
0 -100 "/numeric/0/0" から値取得
1 2147483647 signed int 型の上限、文字列を数値化
2 0.19 科学的表記法 ( 19.0 × 10⁻² )
3 0.00019 科学的表記法 ( 19.0 × 10⁻⁵ )
4 1.9e-05 丸め誤差: 0.000019 が内部的に丸められた値
5 1 Boolean は型変換される

19.0E-6 が 1.9e-05 になる

CF25 の Expression Editor にも共通する仕様。表現可能な最も近い値に丸められる。

0.000019( または 19.0E-6 )は、C 言語の float型 の範囲内に収まりますが、CF25 では 19.0E-6 は内部的に丸められ、有効数字範囲で最も近い表現可能な値 1.9e-05 になります。

Minion Minion


Notes.1

科学的表記法と丸め誤差について

E-5 は科学的表記法、E^-5 という意味です。19.0 * 10 ^ -5 はコンピュータ上で以下のように計算されます。

float  a = 19.0;
float  b = 0.00001; // 10 ^ -5
double c = a * b;   // 0.00018999999999999998

十進数の小数部分( 例:0.00001 )は二進数では無限に続く小数となり、限られたビット数で近似的に表現されます。この近似は計算時に微小な誤差が発生し、19.0 × 10⁻⁵ の計算結果は期待された厳密な値 0.00019 ではなく 0.00018999999999999998 になります。

double 型( 倍精度 )の値は浮動小数点数 ( 単精度浮動小数点数 ) に丸められて 0.00019 になります。


Notes.2

文字列型を数値型に変換する際のロジックについて

簡単な解決法として ASTER では文字列中に . が含まれている場合 float 型でキャストします。

「小数表記」( Decimal Notation ): ".019" という書き方に対応できます。

ただしこの方法だと科学的表記法を用いた場合に問題があり、1E-3 == 0.001 ですが ASTER では文字列化された "1E-3" を浮動小数点数と判定できません。

  • "1E-3" は ASTER では 1 に変換されます。

Notes.3

CF25 の仕様

Double は文字列化して送受信する以外に確実な方法がありません。エクステンション内部では通常 double 型で数値を扱い、計算結果だけを float 型に丸めて CF25 へ返しています。