2017-07-17 2 views
2

Ich versuche, einen zufälligen Punkt auf dem Umfang eines Kreises mit Python zu generieren.Testen Sie, ob ein zufälliger Punkt zu einem Umfang eines Kreises mit Python

Ich habe einen Kreis der Mitte (0, 0) und von Radius 50. Ich habe Folgendes getan.

import numpy as np 
angle = 2 * np.pi * np.random.rand() 
x = np.cos(angle) * 50 
y = np.sin(angle) * 50 

Aber wenn ich testen, ob der Punkt tatsächlich auf dem Kreisumfang ist, ich habe diese

x ** 2 + y ** 2 == 50 ** 2 

aber ich bekomme

False 

Warum ist das?

+2

Mögliche Duplikat [Gleitkomma-Ungenauigkeit Beispiele] (https://stackoverflow.com/questions/2100490/floating-point-inaccuracy-examples) – kay

+1

Wenn Sie will lernen, wie man das benötigte epsilon dann google "numerische Stabilität Fließkomma-Mathematik" schätzt. Leider ist sein Wikipedia-Artikel schrecklich. – kay

Antwort

6

Dies ist das Ergebnis der Gleitkomma-Ungenauigkeit. Im Allgemeinen ist es eine schlechte Idee, zwei Gleitkommazahlen für Gleichheit zu vergleichen, und Sie sollten stattdessen testen, um zu sehen, ob sie sich in einer bestimmten Menge voneinander befinden. Zum Beispiel

epsilon = 0.000001 
print abs(x ** 2 + y ** 2 - 50 ** 2) <= epsilson 

Siehe auch: How should I do floating point comparison?

3

Gleitkommaarithmetik ist nicht exakt, daher funktioniert das Testen auf Gleichheit nicht immer so, wie es mit unendlicher Genauigkeit erwartet werden würde.

Verwandte Themen