![](/img/trans.png)
[英]What is the best way to check if ALL values in a range exist in an array in C?
[英]What is the best way to interpolate for all values of n, with two arrays in c?
我想用兩個數組的信息對 n 的任何值進行插值。 我有一個主文件,其中在整個代碼中都使用了 omega 和 n,並且我有一個用於插值的頭文件。 n 和 omega 在主文件中聲明為int n = 129;
和double omega;
. 我曾嘗試像下面的代碼一樣進行數學插值,但是當 n 的值與數組中的值不同時,它似乎遇到了麻煩。 它似乎適用於 n=30、n=60、n=100 等,但不適用於 n=35、n=129 等。
有沒有其他方法可以更好地進行插值? 我不太擅長指針,所以我不確定我是否正確使用它們,或者是否需要它們。
我試圖為沒有頭文件的插值創建一個單獨的項目,它似乎工作正常,所以我懷疑它與頭文件有關,但我不完全確定。 我正在使用代碼塊。
#include "header.h"
void interpol(int n, double *omega){
int i;
int nn[9] = {0, 5, 10, 20, 30, 40, 60, 100, 500};
double oo[9] = {1.7, 1.78, 1.86, 1.92, 1.95, 1.96, 1.97, 1.98, 1.99};
for (i=0; i<9; i++)
{
if (n<nn[i])
{
*omega = oo[i-1] + ((oo[i+1]-oo[i-1])/(nn[i+1]-nn[i-1]))*(n-nn[i-1]);
break;
}
}
printf("\nomega = %lf \n", *omega);
}
我將添加主文件的簡化版本,因為插值是在最開始的,其余的對於這種情況並不重要。 在標題中是:
void interpol(int n, double *omega);
主要腳本:
#include "header.h"
int main(){
int n;
double omega;
n=129;
interpol(n, &omega);
printf("\nomega = %lf \n", omega);
return 0;
}
對於 n=129,預期值應為 1.98 ish,但結果為 2.6 ish。
問題很可能出在這一點上:
for (i=0; i<9; i++) {
if (n < nn[i]) {
omega = oo[i-1] + ((oo[i+1]-oo[i-1])/(nn[i+1]-nn[i-1]))*(n-nn[i-1]);
break;
}
}
在這里,您有在任何一端閱讀越界的危險。 如果在 i = 0 時,則oo[i - 1]
在起始端向外讀取,在 i = 8 時oo[i + 1]
在末尾向外讀取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.