使用浮点坐标的3D矢量进行计算。偶尔,我想检查一个向量是否非零。但是,对于浮点数,总有可能出现舍入误差。
请问,在Python中是否有一种标准方法来检查浮点数是否足够接近零?我可以写Executing (default): SELECT `Muscule`.`id`, `Muscule`.`title`, `Muscule`.`description`, `Muscule`.`video`, `Muscule`.`createdAt`,
`Muscule`.`updatedAt`, `muscle_exercise`.`createdAt` AS `muscle_exercise.createdAt`, `muscle_exercise`.`updatedAt` AS `muscle_
exercise.updatedAt`, `muscle_exercise`.`MusculeId` AS `muscle_exercise.MusculeId`, `muscle_exercise`.`ExerciseId` AS `muscle_exercise.ExerciseId` FROM `Muscules` AS `Muscule` INNER JOIN `muscle_exercise` AS `muscle_exercise` ON `Muscule`.`id` = `muscle_exercise`.`MusculeId` AND `muscle_exercise`.`ExerciseId` = 11;
Executing (default): SELECT `Muscule`.`id`, `Muscule`.`title`, `Muscule`.`description`, `Muscule`.`video`, `Muscule`.`createdAt`,
`Muscule`.`updatedAt`, `muscle_exercise`.`createdAt` AS `muscle_exercise.createdAt`, `muscle_exercise`.`updatedAt` AS `muscle_
exercise.updatedAt`, `muscle_exercise`.`MusculeId` AS `muscle_exercise.MusculeId`, `muscle_exercise`.`ExerciseId` AS `muscle_exercise.ExerciseId` FROM `Muscules` AS `Muscule` INNER JOIN `muscle_exercise` AS `muscle_exercise` ON `Muscule`.`id` = `muscle_exercise`.`MusculeId` AND `muscle_exercise`.`ExerciseId` = 11;
Executing (default): DELETE FROM `muscle_exercise` WHERE `ExerciseId` = 11 AND `MusculeId` IN (52)
,但这是一个硬编码的截止点,一般会让我感到烦恼......
答案 0 :(得分:3)
就像Ami在评论中写道,这取决于你在做什么。系统epsilon适用于单个操作错误,但是当您在进一步计算中使用已舍入值时,错误可能会比系统epsilon大得多。拿这个极端的例子:
import sys
print('%.20f\n' % sys.float_info.epsilon)
x = 0.1
for _ in range(25):
print('%.20f' % x)
x = 11*x - 1
使用精确值,x
始终为0.1,因为11 * 0.1-1再次为0.1。但真正发生的是:
0.00000000000000022204
0.10000000000000000555
0.10000000000000008882
0.10000000000000097700
0.10000000000001074696
0.10000000000011821655
0.10000000000130038202
0.10000000001430420227
0.10000000015734622494
0.10000000173080847432
0.10000001903889321753
0.10000020942782539279
0.10000230370607932073
0.10002534076687252806
0.10027874843559780871
0.10306623279157589579
0.13372856070733485367
0.47101416778068339042
4.18115584558751685051
44.99271430146268357930
493.91985731608951937233
5432.11843047698494046926
59752.30273524683434516191
657274.33008771517779678106
7230016.63096486683934926987
79530181.94061353802680969238
请注意,原始x
与0.1的差异远远小于我的系统epsilon,但错误很快就会比epsilon大得多,甚至你的0.00001,现在还有数百万。
但这是一个极端的例子,而且你不太可能遇到这么糟糕的事情。但它表明精确度实际上取决于你所做的事情,所以你必须为你的特定计算找到一个好的方法。
答案 1 :(得分:0)
虽然上面的所有内容都是正确的,但是一些google这个问题的人可能会发现数学模块中的isclose
函数值得一试。