배열 함수는 0과 범위를 호출자가 보장합니다
이름이 가장 오해를 부르는 코드는 다음과 같습니다.
1
2
3
4
5
6
7
| float mse_array(float *a, int n)
{
int i;
float sum = 0;
for(i = 0; i < n; ++i) sum += a[i]*a[i];
return sqrt(sum/n);
}
|
제곱 평균에 제곱근까지 취하므로 RMS입니다. 두 배열의 prediction error를 받는 함수도 아니며, 모든 값이 같은 nonzero 상수라고 0이 되지도 않습니다. normalize_array는 표준편차가 0일 때 나눗셈을 막지 않고, mean_array는 n=0을 검사하지 않습니다.
sample_array는 합으로 배열 전체를 나눠 확률화하므로 입력 a를 직접 변경합니다. 합이 0이거나 음수 값이 섞인 경우를 검사하지 않습니다. one_hot_encode도 (int)a[i]가 0...k-1인지 확인하지 않고 바로 index로 씁니다.
rand_int와 rand_uniform은 min, max 순서가 반대면 교환하지만 암호학적 난수 함수가 아닙니다. rand_normal은 Box–Muller 변환의 두 번째 값을 static 변수에 보관합니다. 재현성과 동시 접근 요구가 있다면 외부 seed와 호출 모델까지 함께 관리해야 합니다.
실용적인 검증 순서는 mutation, bounds, empty input, allocation ownership입니다. 각 helper에 정상값 하나만 넣는 대신 min!=0, n=0, 합이 0인 배열, 너무 긴 문자열, field 수 초과를 넣어야 이름 뒤에 숨은 전제가 드러납니다.