在Windows7PC上使用Java(不确定这是否重要)并在应返回0的值(如pi/2)上调用Math.cos()而不是返回小值,但小值,除非我误解,与零相差远大于1ulp。Math.cos(Math.PI/2)=6.123233995736766E-17Math.ulp(Math.cos(Math.PI/2))=1.232595164407831E-32这实际上在1ulp之内,我只是感到困惑吗?这是解决这个小错误的可接受的包装方法吗?publicstaticdoublecos(doublea){doubletemp=Math.abs(a%Math.PI);if(temp==Math.P
背景:我正在用Java编写一些几何软件。我需要Java的BigDecimal类提供的精度。由于BigDecimal不支持三角函数,我想我应该看看Java如何实现标准数学库方法并编写我自己的支持BigDecimal的版本。阅读thisJavaDoc,我了解到Java使用的算法“来自著名的网络库netlib作为包”自由分发数学库”fdlibm。这些算法是用C编程语言编写的,然后可以理解为以所有float执行-遵循Java浮点运算规则的点运算。”我的问题:我查找了fblibm的sin函数,k_sin.c,看起来他们使用13阶泰勒级数来近似正弦(编辑-njuffa评论说fdlibm使用极小极大
我一直在仔细研究.NET反汇编和GCC源代码,但似乎无法在任何地方找到sin()和其他数学函数的实际实现...它们似乎总是引用其他东西。谁能帮我找到他们?我觉得C运行的所有硬件都不太可能支持硬件中的触发函数,所以必须有一个软件算法某处,对吧?我知道可以计算函数的几种方法,并且已经编写了自己的例程来使用泰勒级数计算函数来获得乐趣。我很好奇真实的生产语言是如何做到这一点的,因为我的所有实现总是慢几个数量级,尽管我认为我的算法非常聪明(显然它们不是)。 最佳答案 在GNUlibm中,sin的实现是系统相关的。因此,您可以在sysdeps的
根据我在MathStackexchange上的question:我正在为我的3D图形类(class)做一个项目。该项目是用C++和OpenGL/Glut构建的。基本上,我创建了一个水平矩形窗口,segmentation为两个正方形。在左侧,我有一个二维坐标平面,它允许用户指向并单击并定义轮廓“曲线”。然后我需要将这条曲线围绕Y轴绕n次。那么,有人能指导我如何使用三角函数计算连续点的X和Z值吗?例如,如果用户点击并创建点:(1,1,0)并且它们的扫描分辨率(n)设置为10,然后我需要围绕Y轴每36(360/10)度重绘该点。我假设三角函数会在这方面对我有帮助,我的假设是否正确?如果是这样
我正在编写一个用于计算一些几何变换的应用程序,在测试该程序时,我发现了一些奇怪的东西:我在两台不同的机器上启动了测试,Z400工作站配备Intel®Xeon®处理器W3550和Z800工作站使用英特尔®至强®处理器X5560,一次操作得到了不同的结果:doublex=24.169408798217777*sin(0.59420877837561048)/sin(0.97658754841928608)使用Z400,我得到了x=16.330508228047432虽然Z800抛出这个值x=16.330508228047435最后一位的值不同,我用那个值做了很多计算,所以很不方便。我尝试使
不幸的是,标准C++库没有对sincos的单一调用,这为这个问题提供了空间。第一个问题:如果我想计算sin和cos,计算sin和cos更便宜,还是先计算sin再计算sqrt(1-sin^2)以获得cos?第二个问题:intel数学内核库为标准数学函数计算提供了非常好的函数,因此存在函数vdSinCos()以非常优化的方式解决问题,但intel编译器不是免费的。Linux发行版中是否有任何开源库(C、C++、Fortran)可用,它们具有我可以简单地链接到它们并获得最佳实现的那些功能?注意:我不想深入探讨指令调用,因为并非所有CPU都支持它们。我想链接到一个通用库,它可以在任何CPU上为
我需要帮助来提高我下面的代码的效率,并稍微清理一下。如图所示image,x和y可以是整个屏幕周围的任何点,我正在尝试找到角度t。有什么办法可以减少这里的行数吗?注意:原点在左上角,向右/向下移动为正向移动o:=MiddleOfScreenX-x;a:=MiddleOfScreenY-y;t:=Abs(Degrees(ArcTan(o/a)));if(x>MiddleOfScreenX)thenbeginif(y>MiddleOfScreenY)thent:=180+telset:=360-t;endelseif(y>MiddleOfScreenY)thent:=180-t;代码是pas
我正在实时渲染500x500点。我必须使用atan()和sin()函数计算点的位置。通过使用atan()和sin(),我得到了24fps(每秒帧数)。floatthetaC=atan(value);floath=(value)/(sin(thetaC)));如果我不使用sin(),我将获得52fps。如果我不使用atan(),我将30fps。所以,最大的问题是sin()。我怎样才能使用FastSin版本。我可以为此创建一个查找表吗?我没有任何特定值来创建LUT。在这种情况下我能做什么?PS:我也尝试过ASM的fastsin函数,但没有得到任何区别。谢谢。 最
我想做一个以弧度或度数初始化的角度类,但我不知道这是否是个好主意。我在想这样的事情:classRadian;classDegree;/***Myangleclass.**/classAngle{private:floatm_radian;public:explicitAngle(constRadian&rad);explicitAngle(constDegree°);floatGetRadian(void)const{returnthis->m_radian;}floatGetDegree(void)const{returnToDegree(this->m_radian);}bo
我需要实现一个实时同步正交检测器。检测器接收输入数据流(来自PCIADC)并返回谐波w的幅度。有简化的C++代码:doubleLowFreqFilter::process(doublein){avg=avg*a+in*(1-a);returnavg;}classQuadroDetect{doublewt;constdoublewdt;LowFreqFilterlf1;LowFreqFilterlf2;QuadroDetect(constdoublew,constdoubledt):wt(0),wdt(w*dt){}inlinedoubleprocess(constdoublein){d