- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的单元测试在 Math.Tan(-PI/2)
上失败,返回 .NET 中的错误版本。
“预期”值取自 Wolfram 在线(使用 -Pi/2 的拼写常量)。自己看here .
正如在评论中正确观察到的,tan(-pi/2) 的数学结果是无穷大。但是,常量 Math.PI
并不能完美地表示 PI,因此这是一个“接近极限”的输入。
这是代码。
double MINUS_HALF_PI = -1.570796326794896557998981734272d;
Console.WriteLine(MINUS_HALF_PI == -Math.PI/2); //just checking...
double tan = Math.Tan(MINUS_HALF_PI);
Console.WriteLine("DotNET {0:E20}", tan);
double expected = -1.633123935319534506380133589474e16;
Console.WriteLine("Wolfram {0:E20}", expected);
double off = Math.Abs(tan-expected);
Console.WriteLine(" {0:E20}", off);
这是打印的内容:
True
DotNET -1.63317787283838440000E+016
Wolfram -1.63312393531953460000E+016
5.39375188498000000000E+011
我认为这是浮点表示法的问题。
但奇怪的是,Java 中的相同内容确实会返回与 Wolfram 相同的值,直到最后一位数字 - 请参阅 Eclipse 中的评估。 (表达式被裁剪了 - 你必须相信我,它们使用与上面的 MINUS_HALF_PI
相同的常量。)
True
DotNET -1.63317787283838440000E+016
Wolfram -1.63312393531953460000E+016
Java -1.63312393531953700000E+016
如您所见,区别在于:
~5.39 * 10^11
=2.40 * 10^1
那是十个数量级!
那么,您知道为什么 .NET 和 Java 实现如此不同吗?我希望他们都将实际计算推迟到处理器。这个假设对于 x86 来说不切实际吗?
根据要求,我尝试使用 strictfp
在 Java 中运行。没有变化:
最佳答案
整个问题的构建是为了产生一个有倾向性的结果。最接近PI一半的double
值为-1.5707963267948966
;其他数字被忽略。因此,难怪 C# 和 Java 都检测不到剩余的 14 位数字不是使结果更接近 -PI/2
,而是经过精心选择以欺骗 Wolfram Alpha返回一个接近 Java 结果的值。
-1.570796326794896557998981734272 // the number from the question
-1.57079632679489661923132169163975… // the real digits of -PI/2
↑
the end of the double precision
范围内的任何其他数字将四舍五入为相同的 double
数字,包括 the exact double value as used by Java在 Wolfram Alpha 上产生的值与 C# 和 Java 结果都没有任何共同之处。
关于java - Math.Tan() near -Pi/2 在 .NET 中错误,在 Java 中正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20287765/
我有两个数据框列“vibration_X”和“vibration_Y”。此外,我在某些列中几乎没有零值。我想创建新列“theta”,它是vibration_Y 和vibration_X 的tan 倒数
我知道我可以做到: //With A = tax(x); return tan(arctan(A)/2); 但我想要更高效的东西。 最佳答案 当 x 介于 -π/2 和 π/2 之间时,您可以使用此公
我正在尝试编写以弧度为单位计算角度 tan 的函数。我必须使用泰勒级数使用迭代来完成此操作,但仅限于前 13 个提名者和分母。公式如下: http://upload.wikimedia.org/mat
我正在尝试计算三点之间的角度,我需要使用 Tangent 函数 tan() .奇怪的是 VBA 返回错误的值。 例如: tan(209) = 0.554309051 但在 VBA 中: tan(209
这个问题已经有答案了: 已关闭 10 年前。 Possible Duplicate: tan 45 gives me 0.9999 当我使用tan时我得到了一个很长的答案: double degree
我遇到了一些代码问题,但找不到错误。我正在尝试计算下图中用红色标记的距离。 我的代码返回值:-41.63 正确值为:3.75 我的代码: return round(6.5 * tan(30),2);
我试着算出三角形的角。 如果三角形的一边是100,另一边是100。 我如何使它达到 45 度。 如果我在我的计算器上运行 tan-1(100/100),我得到 45。我如何在 PHP 中执行此操作?
如何在C++编程语言中从0度到360度打印sin,cos和tan的值? #include #include using namespace std; #define PI 3.14159265 i
好吧,我在我的一个游戏中为僵尸制作了一个人工智能,但是当我尝试旋转僵尸以便他面对玩家时,一切都变得一团糟。他们以错误的方式旋转,当我靠近时旋转,即使角度不应该改变。这是我的一些代码:ps 忽略 z,这
我想在 JS 中获取三 Angular 形的 Angular 。 计算对边/邻边后如何得到与正切的 Angular ? 最佳答案 degrees = Math.atan(a/b) * 180 / Ma
我目前正在为 Windows Phone 编写一个计算程序。计算之一是找到用户输入的数字乘以用户输入的另一个数字的正切值。 问题是,当我输入 1*tan(45)(即 1)时,它返回 1.6...。我通
我试图在 python 中计算 tan 的倒数,但它没有给我正确的值,例如,如果我要做 1.18 的倒数,math.atan(1.18) >>>math.atan(1.18) 0.8677 但是,正确
Tan 函数 返回某个角的正切值。 Tan(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Tan 取某个角并返回直角三角形两个直角边的比值。此比值
如何在 iOS SDK 中计算 cos、sin、tan 等三角函数? 我尝试了 tan(45) 但它返回了错误的输出。有什么帮助吗? 最佳答案 大多数数学库使用 radians ,而不是度数。 关于i
import java.util.Scanner; public class a { /** * @param args */ public static void m
我正在测试一个程序,该程序读取数学输入,并根据运算顺序计算答案。我遇到了一个问题。计算 Math.PI/2 的正切时,返回值 1.633123935319537E16。 但是,在我的程序中的某个位置,
我正在使用此链接上的公式制作计算器: http://cereference.com/book/surveying-and-transportation-engineering/simple-curve
我一直在使用 Decimal.js 来提高我的函数的精度,该函数通过反复试验计算 a = tan(a) 的第 m 个正根。它可以工作,但是对于 nTan(504)(将返回 4.4934... 到 50
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我想返回一个值的棕褐色,该值是 35,但我得到的是 0.473815。但是这个值应该是 0.70020753...?为什么它给我 0.473815?我正在使用 tan(35)?我不明白为什么会这样说。
我是一名优秀的程序员,十分优秀!