typedef struct PealValley {
double Peakval[Len_Data];
double Valleyval[Len_Data];
double PeakValle[Len_Data];
}PP;
for (n_data = 1; n_data < len-1; n_data++)
{
if ((data[n_data] > data[n_data - 1]) && (data[n_data] > data[n_data + 1])) //筛选峰值
{
(PeakVall->Peakval)[i] = data[n_data];
(PeakVall->PeakValle)[k] = data[n_data];
i++;
k++;
}
else if ((data[n_data] < data[n_data - 1]) && (data[n_data] < data[n_data + 1])) //筛选谷值
{
PeakVall->Valleyval[j] = data[n_data];
PeakVall->PeakValle[k] = data[n_data];
j++;
k++;
}
}
这段代码很简单就是一个求峰值和谷值的程序,但是计算出来的峰值和谷值有问题。
求出来的数据峰值是这样的:
我看了数据,正常是前面7个正确 ,但是后面的一大堆不知道咋回事
4.考虑到3中所说的问题是因为double的数据小数位数太多导致的, 我想把2.6779999999999999这个数据在计算过程中保留两位小数【注意不是显示两位小数】,便于后续计算,应该怎么操作?
保留两位小数,就把原始数据+0.05,然后乘以100,再取整,再除掉100即可
n_data + 1 会越界
首先,第一个问题,浮点运算是采用科学技术法来表示的,计算机正常采用的是IEEE754浮点数标准,举个例子一个八位(阶位)表示:2.999它对应的科学计数法写法 0.29990000 × 10的一次方(它是会补0的),cpu在计算浮点数的时候零也是会被进行多次的(或)运算,个人感觉这个把浮点数后面该为零对计算速度影响应该可以忽略不计(再加上你要遇五进一,这种额外的运算量,不划算),除非改成整数。第二个问题,同类型的赋值是不会出现丢失精度问题的(个人猜测可能你那里写错了)。第三个问题,前面解释了,优化方案,如果你只需要两位小数那可以直接乘上100全部改为整数运算会快很多,最后结束的时候在把它转换过来(方法很多,具体看要求数据量,空间,时间,最快的不一定是最好的)