2

現在、私は、Cでいくつかの2Dジオメトリを実行しています。これらの行にはすべての種類の傾斜があります:0.001〜1000(例では、わかりません)。C浮動小数点:2Dジオメトリ(線)のためにそれらを回る方法

私は現在まで浮動小数点数を使用していましたが、値が非常に小さいかどうか心配する必要はありませんでした(浮動小数点数は1e-3として1e-3を丸めなしで格納する)か、 1e3として保存されます)、どちらの場合でも適切な場合は精度がほとんど損なわれません。

しかし、私は浮動小数点数を使わずに、整数で試してみたいと思っています。私の計算の精度を維持する方法?私は坂が大きくなるか小さくなるかを告げるフラグをつけることができ、大きな斜面の10分の1と小さい斜面を考慮すると、小さな斜面では丸めが問題なく、大きな斜面ではあふれがない。しかし、それは頭痛のように感じます。

基本的には、傾き0.2と0.4を区別できる必要があります。また、オーバーフロー側で1000と2000の勾配を区別する必要があります(ここで1000の整数がオーバーフローすると仮定します)。

他のアイデアはありますか?整数

struct slope { 
    int delta_y; 
    int delta_x; 
}; 

の対として

+2

立ち上がりと実行の両方を保存する以外にも、 –

+2

「ダブル」を使用し、不正確さで生きていますか?なぜ15桁以上の精度の重要な数字が必要なのでしょうか?その正確さの量は、ここから冥王星への距離をセンチメートルで測定するのに十分です。 – Bathsheba

+1

常に計算上のジオメトリを実行する際には、不合理な数字があるので、常に不正確さがあります。 –

答えて

6

ストア傾斜これも0+/- 1/INT_MAX ... +/- INT_MAX、垂直のような傾斜の広い範囲を可能にします。慎重にコーディングすることで、正確な計算を行うことができます。

謝辞:これは@Ignacio Vazquez-Abrams commentとよく似ています。

+1

特に傾斜を計算せずに 'slope'インスタンスを使うことができるのは良い考えです。私はメンバーの一人を「署名なし」にすることを検討するかもしれませんが、とにかく入力を「正規化」したいと思うかもしれないので、あなたはそのようなものを並べ替えることができると言っています(例えば{-2、-4} {1、2}と同じ)。 – Bathsheba

+0

@Bathshebaについて1つのフィールドを 'unsigned'と' int numerator;符号なし分母; '。しかし、それはいくつかの計算を少しトリッキーにします。 'int delta_y、delta_x;'はOPにそのアイデアを紹介する良い方法のようです。 – chux

+1

署名された議論が署名されていない議論のタイプへの望ましくない昇進で湯に入ることもあります。 – Bathsheba

0

一般的な方法でintを使用する場合は、fixed point arithmeticを参照してください。

アルゴリズムを設計して、すべての計算を部分整数精度(たとえば、Bresenham's lineおよびcircleの描画アルゴリズムを参照)が不要な方法で行うようにすることもできます。

特に問題には、商と分数を別々に、つまり有理数を使用することができます。または、別の言い方をすると、デルタXとデルタYを2つの数として持つことができます。

3

一般的に言えば、任意の方向の線では、傾き/切片表現y = mx + pを使用することは推奨されませんが、暗黙の式a x + b y + c = 0が使用されます。後者はより等方的で、垂直線をサポートし、係数をスケーリングするために余分な柔軟性を与えます。 chuxの答え@

会議、係数がデルタ、(ライン2点によって定義されると仮定すると、DxDyはないオーバーフロー可能性がある)とすることができます。 cではまだオーバーフローが可能で、Dy (x - x0) - Dx (y - y0) = 0というバリアントを使用できます。いずれにしても、交差などの中間計算では、より大きな範囲、すなわち倍長整数が必要になる場合があります。

大きな値と小さい値のフラグを立てるというアイデアは少し生産的ではありません。浮動小数点を実行する基本的な方法です。すなわち、仮数部から仮数部を切り離すことです。このようにして、組み込み型よりも強力でなく、汗や涙が出るような、浮動小数点システムを何とか再設計します。


残念ながら、高域算術を避けることはできません。実際、二つの直線の交点をクラマーによって与えられる製品を評価する

x = (c b' - c' b)/(a b' - a' b), 
y = (a c' - a' c)/(a b' - a' b) 

が初期係数よりも大きい大きさのオーダーである式。これは、準平行線が遠くの交差点を有するという事実によって説明される。

関連する問題