5

何が起こっている??

sin 関数と cos 関数をテストして、座標を SVG ファイルに出力するときに間違った場所に美しい配置が得られる理由を見つけます。そこで、このテスト コードを作成しました。これにより、答えが何であるかを予測して、その理由を見つけることができます。奇妙なことに、計算自体に影響を与えるものは何も追加されず、この動作が追加されますが、単に私が滞在しようとしている場所の位置が追加されます。位置が 0 で計算後に 0 になる場合は機能しませんが、位置が 1 で計算後に 1 になる場合は機能します。

最初のテスト:

import math

cX = 2
cY = 2
r = 2

rcX = cX + (r * math.cos(math.radians(0)))
rcY = cY + (r * math.sin(math.radians(0)))

print rcX #4
print rcY #2
r = 1

rlX = rcX + (r * math.cos(math.radians(90)))
rlY = rcY + (r * math.sin(math.radians(90)))

print rlX #4
print rlY #3
r = 4

flX = rlX + (r * math.cos(math.radians(180)))
flY = rlY + (r * math.sin(math.radians(180)))

print flX #0
print flY #3
r = 2

print r * math.cos(math.radians(270))
print flX + (r * math.cos(math.radians(270))) #-3.67394039744e-16 should be 0
print flY + (r * math.sin(math.radians(270))) #1

cX を 3 に変更すると、次の計算に影響を与えなくても機能します。

r * math.cos(math.radians(270))

その計算結果がx座標に加算されます

import math

cX = 3
cY = 2
r = 2

rcX = cX + (r * math.cos(math.radians(0)))
rcY = cY + (r * math.sin(math.radians(0)))

print rcX #5
print rcY #2
r = 1

rlX = rcX + (r * math.cos(math.radians(90)))
rlY = rcY + (r * math.sin(math.radians(90)))

print rlX #5
print rlY #3
r = 4

flX = rlX + (r * math.cos(math.radians(180)))
flY = rlY + (r * math.sin(math.radians(180)))

print flX #1
print flY #3
r = 2

print r * math.cos(math.radians(270))
print flX + (r * math.cos(math.radians(270))) #1
print flY + (r * math.sin(math.radians(270))) #1
4

3 に答える 3

9

実際、それは非常に低い数字であり、非常にゼロに近いものです。フロートの一般的な課題と落とし穴を理解するのに役立つ素晴らしい記事を次に示します。「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

于 2012-11-06T22:20:47.430 に答える
6

あなたは丸め誤差を扱っています。これは、浮動小数点演算を扱うときに(ほとんど)避けられないものです(何が起こっているのかを正確に理解するには、他の人がすでにリンクしている論文を参照してください)。

多くの場合、影響を減らすことができます (操作を「インテリジェントな」順序で実行するか、式をより「浮動小数点に適した」方法で再構築することにより)、状況で行う最も簡単な方法は、結果を次のように丸めることです。小数点以下6桁で満足してください。確かに、位置決めにこれ以上の精度は必要なく、「標準的な」角度で期待する結果が得られます。

于 2012-11-06T22:19:45.060 に答える
0

今日のプロジェクトでは、270 度の cos、sin、tan を扱う必要がありました。結果をググって自分でチェックしなければ、エラーがあったことを知らなかったでしょう。(理由もなく度数をラジアンに変えるのはばかげていることを知っています。それは彼らがプロジェクトに望んでいたことです。)

最初にラジアンを丸めている限り、cos と sin は機能していましたが、tan はかなり外れていました。

手動で計算を行い、0 で除算できないというエラーをキャッチして、未定義に設定することで接線を修正しました。

    #variables for various trigonometric functions (sine, cosine and tangent) of 270 degrees
    DEGREE = 270
    RADIAN = round(m.radians(DEGREE), 3) #the degree has to be converted to a radian to input into the math.cos and math.sin functions
    COS = round(m.cos(RADIAN), 2) #pass the radian to get the cosine
    SIN = round(m.sin(RADIAN), 2) #pass the radian to get the sine

    try:
         # the math library did not return the correct answer for tangent when dividing by 0
         # so, I manually did the math, this catches the division by zero and correctly labels the tangent
         # as undefined
        tan = round(SIN/COS, 2)
        
    except:
        tan = "Undefined"

    print("\n\nMathematical Constants") #display a title for the list

    #headers list for each function
    headers = ["Pi", "e", "Sine(270\u00b0)", "Cosine(270\u00b0)", "Tangent(270\u00b0)"]
    #list of each constant
    dataList = [round(m.pi, 2), round(m.e, 2), SIN, COS , tan]

    #looping iterator to diplay each function
    i = 0
    while i < len(headers):
        print("------")
        print(headers[i] + ": " + str(dataList[i]))

        i += 1 #increase iterator by one
于 2022-01-15T04:38:56.520 に答える