0

追加を実行するための次の Jena ルールがあります。

@prefix pm:     <http://example.org/ProductionMesure#>.
@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix owl:    <http://www.w3.org/2002/07/owl#>.
@prefix pr:     <http://example.org/Production#>.

[r1:
(?mesCavTur rdf:type        pr:Mesure)
(?cavTur    owl:ensemble_de ?mesCavTur)
noValue(?cavTur owl:valeur ?x)
-> 
(?cavTur    owl:valeur      0.0)
]

[r2:
(?mesCavTur rdf:type        pr:Mesure)
(?mesCavTur owl:valeur      ?valeur)
noValue(?mesCavTur pm:flag pm:done)
(?cavTur    owl:ensemble_de ?mesCavTur)
(?cavTur    owl:valeur      ?oldValeur)
sum(?valeur, ?oldValeur, ?somme)
-> 
drop(4)
(?cavTur    owl:valeur      ?somme)
(?mesCavTur pm:flag pm:done)
hide(pm:flag)
]

ルールはほぼ正しく機能しており、目的の加算結果を実行しています。私が抱えている問題は、sum 関数に渡される値が両方とも float であるのに、返される値 (?somme) が double として返されることです。

これによる予期しない結果は、結果に小さな 10 進数が追加されることです (これは型変換と関係があると思います)。

たとえば、2.2、2.5、および 2.7 の 3 つの値の合計を求めたいとします。私が得た結果は 7.1000000953674316 です (これは近いですが、まったく正しくありません)。

この Jena ルールを使用して、float 値 (?valeur & ?oldValeur) を double 型に変換し、これらの新しい double 値で sum 関数を実行し、最後に出力 (?somme) を変換する方法はありますか?フロート値に?

これを行うことで、余分な小数点以下の桁数が出力に追加されない可能性があると思います。

4

1 に答える 1

0

ほとんどの浮動小数点数はバイナリで正確に表現されていないため、浮動小数点数を表示するときに丸めの問題がよく発生します。したがって、floatの代わりに sを使用したとしてもdoubles、小さな近似誤差の問題は依然として発生します。

選択肢は 2 つあります。たとえば、すべての数値を 100 または 1000 でスケーリング (乗算) し、ユーザーに出力を生成するときにそれらを元に戻すことを忘れないでください。または、表示の問題を別の問題として扱うことができます。出力で数値をレンダリングする場合は、Javaに組み込まれているものなどの数値書式設定ライブラリを使用するか、StackOverflow に関する他の提案を使用してください。個人的には、2番目の選択をします。

于 2013-01-23T00:22:22.310 に答える