#include<stdio.h>
#define N 10
#include<stdlib.h>
double_comp(const void*a,const void*b){
return(*(double*)a-*(double*)b);
}
int main(void)
{
double a[N];
int i;
for(i=0;i<N;i++){
a=1.0/(0.1*rand()+1);
}
qsort(a,N,sizeof(double),double_comp);
for(i=0;i<N;i++){
printf("%.12f\n",a);
}
return(0);
}
乱数でデータを発生させて、qsort関数を用いて小さい順に並べ直すプログラムを作成したいのですが、うまくソートされません。
比較関数の書き方を教えていただけると助かります。
qsortのdouble型
Re: qsortのdouble型
コードはcodeタグで囲んでいただけるとありがたいです。
qsortの比較関数は、一般的にオーバーフローの危険があるため、引き算はよくないとされています。
特に今回はdouble型なので、値が違っても引き算すると絶対値が1未満になり、
切り捨てで0になる(=同じ値とみなされてしまう)可能性が高いです。
どのくらいの速度が必要なのかわかりませんが、私は普通こんな感じで書きます。
qsortの比較関数は、一般的にオーバーフローの危険があるため、引き算はよくないとされています。
特に今回はdouble型なので、値が違っても引き算すると絶対値が1未満になり、
切り捨てで0になる(=同じ値とみなされてしまう)可能性が高いです。
どのくらいの速度が必要なのかわかりませんが、私は普通こんな感じで書きます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
Blue
Re: qsortのdouble型
qsortの比較関数の戻り値はintですので、
>>return(*(double*)a-*(double*)b);
だと、intにキャストされ、1未満の値が全て落ちちゃって判定がうまくいっていないんでしょう。
具体的な記述はみけCATさんが記述してくださっていますのでそちらを参照してください。
あと、この例だと毎回同じ値になってしまうので、srand関数を使ったほうがよいですね。
(実際はそうしているかもしれないけど)
>>return(*(double*)a-*(double*)b);
だと、intにキャストされ、1未満の値が全て落ちちゃって判定がうまくいっていないんでしょう。
具体的な記述はみけCATさんが記述してくださっていますのでそちらを参照してください。
あと、この例だと毎回同じ値になってしまうので、srand関数を使ったほうがよいですね。
(実際はそうしているかもしれないけど)