pow()NaN值的灾难性表现是什么原因?据我所知,如果使用SSE而不是x87 FPU进行浮点数学运算,NaN不应该对性能产生影响.
这似乎适用于基本操作,但不适用于pow().我将双倍的乘法和除法比作平方,然后取平方根.如果我用下面的代码编译g++ -lrt,我得到以下结果:
multTime(3.14159): 20.1328ms
multTime(nan): 244.173ms
powTime(3.14159): 92.0235ms
powTime(nan): 1322.33ms
Run Code Online (Sandbox Code Playgroud)
正如所料,涉及NaN的计算需要相当长的时间.g++ -lrt -msse2 -mfpmath=sse然而,编译会导致以下时间:
multTime(3.14159): 22.0213ms
multTime(nan): 13.066ms
powTime(3.14159): 97.7823ms
powTime(nan): 1211.27ms
Run Code Online (Sandbox Code Playgroud)
NaN的乘法/除法现在要快得多(实际上比实数更快),但是平方和取平方根仍然需要很长时间.
测试代码(在VMWare中使用32位OpenSuSE 10.2上的gcc 4.1.2编译,CPU是Core i7-2620M)
#include <iostream>
#include <sys/time.h>
#include <cmath>
void multTime( double d )
{
struct timespec startTime, endTime;
double durationNanoseconds;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &startTime);
for(int i=0; i<1000000; i++)
{
d = 2*d;
d = 0.5*d;
}
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &endTime);
durationNanoseconds = 1e9*(endTime.tv_sec - startTime.tv_sec) + (endTime.tv_nsec …Run Code Online (Sandbox Code Playgroud) 我理解为什么sin(pi)不等于零的原因是因为没有足够的位来存储"pi"的所有有效数字,但这与机器epsilon有什么关系?
我在网上读到了什么机器epsilon,但经过一个小时的阅读,各种不同的定义措辞不同,我感到困惑,并不理解epsilon的概念.我最终对自己的愚蠢感到非常沮丧......
以下示例在MATLAB文档中给出,我不明白,有人可以向我解释该示例试图显示的内容吗?
找到从10.0到下一个最大双精度数的距离.
Run Code Online (Sandbox Code Playgroud)d = eps(10.0) d = 1.7764e-15
我试图在Octave中运行MATLAB代码,但在以下方面陷入困境:
I 是一个空矩阵,尺寸为0x4,
a = 2;
Run Code Online (Sandbox Code Playgroud)
属于for循环的命令是:
I = [I a];
Run Code Online (Sandbox Code Playgroud)
MATLAB输出: I = 2
八度输出:"水平尺寸不匹配(0x4 vs 1x1)"
我找到了解决此错误的方法,但我也想了解:为什么MATLAB接受这些不同的维度而Octave会输出错误?是否有关于空矩阵的不同定义并扩展它们?(特别是因为它不是"普通"空矩阵而是0x4空矩阵?)