C言語でHDF5に逐次アクセスする方法

[![Github](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1646184/0e201e0c-e21f-a715-4353-142b23059ccd.png)](https://github.com/saliton/HDF5/) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/saliton/HDF5/blob/main/HDF5.ipynb)

>ご覧いただきありがとうございます。
>Google Colaboratoryにアカウントをお持ちの方は、上の「Open in Colab」と書かれた青いボタンを押せば直接notebookをColabで開けます。ぜひ動かしてみてください。
>過去の記事も含め、全てのコードを[Github](https://github.com/saliton)で公開しています。

先日、HDF5形式のデータを処理する機会がありました。その際、中のデータに逐次アクセスする方法を探すのに少し苦労したので、忘備録として記事にします。

データは[ann-benchmarks](http://ann-benchmarks.com/)のglove-100-angularです。Pythonならh5pyで簡単に逐次アクセスできるのですが、とある事情でC言語が必要でした。しかし、目に付くサンプルコードは大きなバッファを用意して全体を一括で読み込むものばかりでした。今回、ゆくゆくはメモリに載り切らないサイズのデータを扱う予定なので、逐次アクセスが必要です。いろいろ探してようやく発見したのが[ここ](https://portal.hdfgroup.org/display/HDF5/How+Do+I)で、その中の[Read 2D dataset by row](https://bitbucket.hdfgroup.org/projects/SUP/repos/training/browse/examples/C/h5_read_by_row.c?at=e68d8bb913dcdd80fc7ded1311707dcab75a39c6&raw)です。

ただ、定数が決め打ちされていたりで、汎用性に乏しかったので、改造しました。以下がその経緯です。

まずはデータを取得します。

```shell
!wget http://ann-benchmarks.com/glove-100-angular.hdf5
```

    --2022-11-07 05:28:13--  http://ann-benchmarks.com/glove-100-angular.hdf5
    .
    .
    .
    glove-100-angular.h 100%[===================>] 462.93M  33.3MB/s    in 15s

    2022-11-07 05:28:28 (31.8 MB/s) - ‘glove-100-angular.hdf5’ saved [485413888/485413888]

HDF5関連のツールをインストールして、データの中身を覗きます。

```shell
!apt install hdf5-tools
```

    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    .
    .
    .
    Setting up hdf5-tools (1.10.0-patch1+docs-4) ...
    Processing triggers for man-db (2.8.3-2ubuntu0.1) ...

4つのDatasetが含まれていることが分かります。

```shell
!h5ls glove-100-angular.hdf5
```

    distances                Dataset {10000, 100}
    neighbors                Dataset {10000, 100}
    test                     Dataset {10000, 100}
    train                    Dataset {1183514, 100}

```shell
!h5ls -v glove-100-angular.hdf5
```

    Opened "glove-100-angular.hdf5" with sec2 driver.
    distances                Dataset {10000/10000, 100/100}
        Location:  1:477411840
        Links:     1
        Storage:   4000000 logical bytes, 4000000 allocated bytes, 100.00% utilization
        Type:      native float
    neighbors                Dataset {10000/10000, 100/100}
        Location:  1:1800
        Links:     1
        Storage:   4000000 logical bytes, 4000000 allocated bytes, 100.00% utilization
        Type:      native int
    test                     Dataset {10000/10000, 100/100}
        Location:  1:1528
        Links:     1
        Storage:   4000000 logical bytes, 4000000 allocated bytes, 100.00% utilization
        Type:      native float
    train                    Dataset {1183514/1183514, 100/100}
        Location:  1:928
        Links:     1
        Storage:   473405600 logical bytes, 473405600 allocated bytes, 100.00% utilization
        Type:      native float

今回、この中のデータタイプがfloatのdistance, test, trainにアクセスすることを考えます。以下で、各パートを説明してから、最後にColabで動作するサンプルコード全体を示します。

まず、HDF5ファイルをオープンします。

```C
hid_t file_id = H5Fopen(h5file, H5F_ACC_RDONLY, H5P_DEFAULT);
```

次にその中のデータセットをオープンします。

```C
hid_t dataset_id = H5Dopen(file_id, dataset_name, H5P_DEFAULT);
```

データセットの構造データを取得するのに必要なIDは以下で取得します。

```C
hid_t filespace_id = H5Dget_space(dataset_id);
```

このfilespace_idを使って、データセットの次元数を取得できます。

```C
int ndims = H5Sget_simple_extent_ndims(filespace_id);
hsize_t *dims = malloc(sizeof(hsize_t) * ndims);
H5Sget_simple_extent_dims(filespace_id, dims, NULL);
```

今回はndimsは2になります。dimsに各次元の要素数が取得されます。

データのタイプは以下で取得できます。

```C
hid_t type = H5Dget_type(dataset_id);
```

これがfloatであるか否かは以下で判定できます。

```C
H5TEqual(type, H5T_NATIVE_FLOAT)
```

次にデータを受け取るバッファの型を作成します。今回の場合、要素数100のベクトルです。

```C
hsize_t dimsmr[1] = {dims[1]};
hid_t memspace_id = H5Screate_simple(1, dimsmr, NULL);
```

バッファを用意します。

```C
float *rdata = malloc(dims[1] * sizeof(float));
```

データの読み初めの位置は以下のように指定します。

```C
hsize_t roffset[2] = {start, 0};
```

データの読み取り数は以下のように指定します。

```C
hsize_t rcount[2] = {1, dims[1]};
```

データの読み取り位置を設定するには以下のようにします。

```C
H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET, roffset, NULL, rcount, NULL)
```

そして、実際の読み取りは以下。

```C
H5Dread(dataset_id, H5T_NATIVE_FLOAT, memspace_id, filespace_id,　H5P_DEFAULT, rdata);
```

これで1ベクトルだけ読み取られます。後はこれを必要な回数、繰り返します。ただし、読み取り位置を進めるためにループの最後でroffset[0]をインクリメントします。

```C
roffset[0]++;
```

以下に全体のコードを示します。見やすくするため一部のエラー処理は省いています。

```C
%%writefile h5range.c

#include <stdlib.h>
#include <hdf5.h>

int main(int argc, const char **argv)
{
  if (argc < 5)
  {
    printf("Usage: %s %s\n", argv[0], "file.h5 dataset_name start count");
    return -1;
  }

  const char *h5file = argv[1];
  const char *dataset_name = argv[2];
  int start = atoi(argv[3]);
  int count = atoi(argv[4]);

  // ファイルIDの取得
  hid_t file_id = H5Fopen(h5file, H5F_ACC_RDONLY, H5P_DEFAULT);

  // データセットIDの取得
  hid_t dataset_id = H5Dopen(file_id, dataset_name, H5P_DEFAULT);

  // データ空間IDの取得
  hid_t filespace_id = H5Dget_space(dataset_id);

  // データの次元数の取得
  int ndims = H5Sget_simple_extent_ndims(filespace_id);
  if (ndims != 2) {
    printf("Error: Dimension of %s must be 2.\n", dataset_name);
    return -1;
  }
  hsize_t *dims = malloc(sizeof(hsize_t) * ndims);
  H5Sget_simple_extent_dims(filespace_id, dims, NULL);

  // データ型の確認
  hid_t type = H5Dget_type(dataset_id);
  if (!H5Tequal(type, H5T_NATIVE_FLOAT)) {
      printf("Error: Data type is not float.\n");
      return -1;
  }

  // バッファの型の作成
  hsize_t dimsmr[1] = {dims[1]};
  hid_t memspace_id = H5Screate_simple(1, dimsmr, NULL);

  // バッファの用意
  float *rdata = malloc(dims[1] * sizeof(float));

  // バッファの読み取り位置
  hsize_t roffset[2] = {start, 0};

  // 読み取り数
  hsize_t rcount[2] = {1, dims[1]};

  herr_t status;
  for (int i = 0; i < count; i++) {
    // 読み取り位置の設定
    status = H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET, roffset,
                                 NULL, rcount, NULL);

    // 読み取り
    status = H5Dread(dataset_id, H5T_NATIVE_FLOAT, memspace_id, filespace_id,
                     H5P_DEFAULT, rdata);

    // データ表示
    printf("%d ", start + i);
    for (int j = 0; j < dims[1]; j++) printf(" %f", rdata[j]);
    printf("\n");

    // 読み取り位置の更新
    roffset[0]++;
  }

  // 後始末
  status = H5Sclose(filespace_id);
  status = H5Sclose(memspace_id);
  status = H5Dclose(dataset_id);
  status = H5Fclose(file_id);
  free(rdata);
  free(dims);
  return 0;
}
```

    Writing h5range.c

このコードは以下のようにコンパイルできます。HDF5用の環境設定がなされているh5ccというコマンドが便利です。

```shell
!h5cc h5range.c -o h5range
```

実際にデータセット名にtestと開始位置、取得数を指定して実行するとこうなります。

```shell
!./h5range glove-100-angular.hdf5 test 100 10
```

    100  -0.094124 0.338080 -0.190860 0.090983 -0.321030 -0.799010 0.034296 -0.801610 -0.416370 -0.715350 0.506190 -0.265460 0.517490 -0.208460 -0.725510 0.213040 0.091537 0.310090 -0.405670 -0.171360 0.208950 0.322130 -1.513000 -0.193310 -0.330370 1.081100 0.077313 0.076293 0.532550 -0.465560 0.793620 1.453500 0.675430 -0.024423 0.046899 -0.603670 0.521600 0.498710 -0.478720 0.323250 1.034100 0.492070 0.459110 -0.378790 -0.221090 -0.521980 0.666180 -0.156820 0.208080 0.350020 1.059800 -0.033208 0.357770 0.522280 -1.143500 -0.021892 -0.026224 0.736040 0.034871 -0.292770 -0.098150 -0.049495 -0.048941 0.018041 -1.104900 0.510700 0.430610 0.161130 0.089007 0.829150 -1.204400 0.815650 -0.288410 -1.224000 1.379100 -0.273440 1.754400 -0.702620 0.494940 1.453000 -0.937610 -0.833340 -0.231860 -0.424260 0.519010 -0.198480 0.374360 -0.907560 -0.281630 0.254800 -0.195280 1.006500 0.309480 -0.232760 0.839360 -0.857950 -0.627310 -0.576660 -0.259010 -0.098490
    101  0.465470 -0.762730 0.020272 0.423900 0.998520 -0.572310 -0.300860 -0.481510 -0.807590 -0.637290 -0.719570 -0.274890 0.661610 0.206740 -0.471380 1.069200 -0.069173 0.658590 -1.251500 -0.813540 0.853120 -0.893320 0.568080 -1.071900 0.284980 0.112010 0.579640 0.060882 -0.387300 -0.573660 -0.184990 0.881480 -0.085400 -0.300220 -0.846870 -0.049195 1.312300 -0.196410 -0.101000 -0.007942 -0.381040 -1.098400 0.447720 -1.201000 -0.008050 -1.648700 0.521890 -0.517500 -0.643750 0.105080 1.169800 -0.439440 -1.666000 -0.246320 -0.611970 -0.112660 1.125400 0.040314 -0.206820 0.018072 0.239320 -1.326900 2.554600 1.152300 -1.372100 1.702700 0.841950 0.582740 0.241090 0.137230 -1.169400 1.231800 -0.771290 0.367340 -0.465320 -0.289600 0.691750 0.258000 0.310570 1.076900 -0.851670 0.057947 -1.108000 0.801930 0.947100 -0.163370 0.615310 -0.325430 1.106000 -0.390960 0.030869 -0.130410 0.968810 0.827300 1.562000 -0.104190 0.139840 1.083200 0.569620 -0.178500
    102  -0.141490 -0.602940 -0.324780 0.007442 -0.095837 0.199770 -0.213950 -0.487290 0.382250 0.276300 0.205510 0.181630 1.586500 0.279430 -0.774620 0.329180 -0.203780 -0.115530 0.225480 0.315590 0.439220 0.774800 0.259880 0.563830 -0.280690 0.549620 0.736250 0.569540 0.343550 0.001127 0.620650 0.017176 0.063790 -0.358230 -0.652070 -0.616800 -0.117050 0.503030 0.141330 -0.174580 0.704180 -0.398440 -0.216910 -0.406580 -0.423290 0.551660 0.572550 0.564260 1.083400 0.954130 0.606490 -0.298280 0.098470 0.974130 0.029584 0.292510 -0.919190 -0.322400 0.224490 -0.536770 0.830730 -0.073229 0.230210 0.344290 -0.576620 0.030888 0.448810 -0.666090 -0.007650 0.492310 0.658210 -0.811740 -0.329420 -0.396230 -0.068171 0.623690 0.568130 0.045020 0.045166 0.845560 -0.511140 -0.558690 0.524250 -0.039312 0.058053 -0.663910 0.207640 -0.729480 -0.136100 -0.935480 -0.489770 -0.143860 -0.515090 0.301460 -0.308890 -0.266490 0.921300 -0.074217 -1.727300 0.844260
    103  0.068420 -0.626120 0.047550 -0.016099 0.048197 -0.170270 0.162880 -0.295130 0.071287 -1.275500 0.211220 -0.647700 0.145060 -0.013382 0.103310 -0.454230 0.082623 0.108180 -0.035548 0.502180 -0.658470 0.207630 -0.360200 -0.383970 -0.095905 1.839900 -0.184140 -0.015352 -0.767310 -0.113320 0.355160 0.010481 0.577730 -0.038969 -0.747780 0.525120 -0.402420 -0.096698 0.093302 0.235670 0.962930 -0.190590 -0.013823 0.702470 0.202370 0.592540 -0.288620 0.597100 -0.166760 0.105840 1.085900 0.623340 -0.607350 -0.086605 0.087138 -0.394040 0.308520 -0.119690 -0.585630 -0.064108 -0.305900 0.724340 -0.601310 -0.034598 -0.696860 0.362130 0.479980 -0.114300 -0.064808 0.372740 -0.426930 0.253460 -0.281730 0.548340 0.713460 0.267660 -0.099164 0.234500 -0.014482 -0.510390 -0.365640 0.010923 0.233730 -0.159830 -0.250400 0.091265 0.722020 -0.361850 0.270320 0.390430 0.352420 0.561560 -0.410060 0.094524 -0.816130 0.538560 0.003401 0.298900 0.072936 0.151870
    104  0.101140 -0.268440 0.002347 -0.302870 -0.071675 -0.369350 -0.140420 0.193470 -0.836870 -0.921300 -0.801160 0.653220 0.701670 1.055200 -0.138530 -0.143010 0.422910 0.191130 1.034700 -0.357410 0.477030 -0.016655 1.241300 -1.385800 0.364170 0.255680 0.203950 -0.315070 -0.126490 0.689420 1.404700 -0.116520 -0.055818 -0.559570 0.035053 0.210500 -0.304630 -0.653610 -0.170840 -0.202670 -0.143710 0.115260 -0.091813 0.475760 0.600170 0.239460 -0.293780 0.382400 -0.225470 1.152700 -0.749890 -0.394860 -0.316710 -0.331940 -0.962530 -0.893820 -0.182930 -0.116820 -1.187600 -0.308020 1.106900 -0.458480 -0.827750 1.040100 -0.884350 -0.515910 0.676050 1.648800 -0.381470 -0.126110 -1.511100 0.574690 -0.125870 -0.321670 -0.725030 0.041088 -0.155520 -0.012045 0.258790 -0.622860 0.217140 -1.484300 0.002502 -0.135600 -0.062417 -0.729570 1.032600 -1.640200 -0.285950 -0.675500 0.309380 -0.700090 0.444430 -0.499030 0.831020 0.409770 -0.461140 -0.073358 0.794150 0.712250
    105  0.336180 -0.493780 -0.371660 0.367010 0.851860 -0.812380 1.514000 -0.819610 -0.781510 0.405980 -1.115700 -0.553690 0.608550 -0.940380 0.100580 -0.480050 -0.238300 0.444930 -0.269380 0.668090 0.345380 -0.307140 -0.158380 -0.067542 -0.391700 0.536690 0.703010 -0.326250 -0.034951 0.211960 1.640200 0.848370 1.181000 -1.092100 -1.399000 0.373460 -0.479810 -0.454030 0.378950 0.585060 0.846870 0.241610 -0.274510 -0.086764 -0.466880 -0.804620 0.716970 -0.268660 0.686640 0.714640 0.463610 0.686050 0.455580 0.433790 -0.828620 0.105650 -1.177500 -0.288770 0.872890 -0.650000 -0.224530 1.397000 0.344210 0.403070 -0.526330 0.437580 0.940900 0.710470 0.011139 -0.104050 -1.307200 0.565220 -0.824470 -0.671040 0.275670 0.249030 -0.524830 -0.513660 -0.625070 0.868050 -1.372900 0.544630 -0.202470 0.745780 -0.802550 -0.372450 0.863830 -1.179600 -1.325900 -0.671340 1.175900 0.283710 -0.124000 0.968110 0.262430 -0.079392 0.227380 0.188200 0.354220 0.878720
    106  -0.363590 0.340350 0.693500 0.395010 -0.064898 0.043411 -0.890120 0.609900 -0.241900 -0.570940 0.113610 -0.558600 -0.324280 -0.727430 0.245150 -0.072813 -0.275070 0.073895 1.022700 0.137000 -1.062300 0.127420 -0.030562 -0.444140 -0.401150 0.875740 0.295370 -0.041493 -0.198550 -0.963790 0.704810 0.751370 -0.098225 -1.710500 0.057154 -0.144030 0.618080 -0.185700 -0.422120 0.426410 0.630670 -0.364150 0.425200 -0.476490 -0.552030 -0.940090 0.799050 -0.121170 0.922380 0.101390 1.539700 0.421540 0.277470 -0.174700 -1.115600 -0.202900 0.794490 0.081000 0.161750 -0.105470 -0.788280 0.738860 -0.146730 -0.088626 -1.134200 1.241000 -0.069622 0.635610 0.754720 -0.835070 -0.475960 0.091624 -0.107820 0.753870 0.261710 1.172900 0.008418 0.392050 0.424700 0.659460 -0.143530 1.144900 -0.040872 0.031070 0.581740 0.076328 0.146070 -0.370410 -0.943390 -0.667250 1.353400 -1.170400 0.158270 -0.758060 -0.757190 -0.395250 -0.321970 -0.671680 0.488000 0.392590
    107  -0.289610 -0.055792 0.026324 0.541750 0.105730 0.428840 -0.353450 -0.210000 0.058706 -0.457980 0.123350 -0.319510 -0.269970 -0.250490 0.003160 -0.214150 -0.348860 -0.042921 -0.096596 0.199680 -0.824990 1.010700 -0.196240 0.013770 -0.355790 1.135700 0.381410 0.429610 -0.264530 -0.368100 0.826640 0.877560 0.327280 -0.621650 -0.584500 -0.471810 -0.495370 0.269040 -0.099457 -0.161310 0.341690 -0.261380 0.102150 0.190680 -0.456320 0.571170 0.248180 -0.674490 0.131030 -0.135880 0.783890 0.132110 -0.400510 0.421800 -0.115990 0.274540 0.081659 -0.261040 -0.346100 0.427880 0.265750 0.936470 -0.125430 0.692820 0.403580 1.033400 0.485710 0.154680 -0.390220 0.458390 -0.302930 0.405740 -0.511240 0.251490 -0.051253 -0.238160 -0.128320 -0.693560 -0.267120 0.029992 -0.688560 1.018900 0.194150 0.090437 -0.296280 0.208830 -0.177650 -0.601070 0.596760 -0.255920 -0.358670 0.659610 -0.261300 0.750060 -0.127120 0.176140 0.009700 0.452410 -0.235670 0.262900
    108  -0.088829 0.212550 0.026513 0.697540 -0.489840 0.168140 -0.066867 -0.208140 0.002116 0.819700 0.261440 0.127240 0.505160 0.421070 0.270820 -0.454680 0.669680 -0.357820 -0.583860 -0.330720 0.089312 -0.073127 -0.411820 -0.283990 -0.233400 0.017831 0.048947 0.760040 0.511780 -0.408130 0.568950 -0.841790 1.322600 0.409400 -1.205100 -0.383520 0.073580 0.253930 0.558590 0.255110 0.644520 -0.194120 -0.082097 -0.215300 -0.592090 0.318040 -0.445210 0.384120 0.100620 0.480940 0.590440 0.269030 0.064831 0.328160 -0.419170 -0.251520 -0.397460 -0.095179 -0.589010 -0.237780 -0.047975 0.243840 0.079106 0.000892 -0.296670 -0.599360 0.488570 0.794880 -0.247690 -0.187920 -0.611780 0.164560 -0.289190 0.656450 -0.356530 0.179820 0.984300 0.313720 -0.865040 0.371460 0.001582 0.009560 -0.310200 -0.493390 -0.411790 0.407620 0.839950 -1.338400 0.395060 -1.865600 0.035020 0.515420 0.607070 -0.069902 -0.257240 0.413210 -0.177340 0.620090 -0.085999 0.376630
    109  -0.528840 -0.707990 -0.575600 0.183010 -0.152240 -0.792830 -0.783310 0.109270 0.881350 -0.335060 -0.009523 0.270110 0.437720 -0.985790 0.380350 -0.935350 0.404960 -0.085473 0.081440 -0.513770 -0.436910 0.134460 0.276210 -0.112040 -0.111360 0.897610 -0.159820 -0.016447 -0.755310 -0.259050 0.215900 0.222090 0.821300 0.221290 -0.939310 0.235050 -0.197950 0.130320 0.062736 -0.542020 0.834280 -0.065961 0.893920 0.415720 -0.663500 1.075100 -0.902380 0.922940 -0.036926 0.817520 0.406600 -0.589500 -0.324910 -0.529730 0.726160 0.018784 0.338580 0.932420 0.259890 -1.001000 0.219390 0.490340 -0.673970 0.569740 0.214950 0.234050 -0.322250 -0.113760 0.687190 0.301520 0.345680 0.330720 -0.391010 0.632870 -0.531490 -0.562520 0.490080 1.071900 0.207700 0.959170 -0.560350 -0.760870 -0.199170 0.284760 0.144610 0.531470 -0.223750 -0.746720 -0.337590 -0.125090 -0.285070 0.513690 -0.235390 0.661990 0.472280 0.298050 -0.329850 -0.203410 0.454400 0.817680

試しにデータ型がintのneighborsを指定すると、エラーになります。

```shell
!./h5range glove-100-angular.hdf5 neighbors 100 10
```

    Error: Data type is not float.

distancesを指定すると、処理に成功します。

```shell
!./h5range glove-100-angular.hdf5 distances 100 10
```

    100  0.306692 0.380962 0.399842 0.410438 0.420184 0.420993 0.432931 0.439501 0.443484 0.445160 0.446063 0.448655 0.449283 0.449308 0.450248 0.453219 0.453476 0.454340 0.454754 0.456131 0.456311 0.457126 0.457430 0.457586 0.459304 0.460581 0.462469 0.463464 0.464061 0.464215 0.464557 0.465545 0.466001 0.466492 0.467570 0.468023 0.468330 0.468832 0.470620 0.471720 0.472298 0.473327 0.473410 0.473602 0.473650 0.473862 0.474963 0.475759 0.475927 0.476193 0.476778 0.476981 0.477009 0.477748 0.478030 0.478299 0.478519 0.478702 0.479348 0.480401 0.480420 0.481024 0.481745 0.482127 0.482160 0.482298 0.482526 0.482702 0.482898 0.482959 0.482972 0.483744 0.483950 0.484403 0.484597 0.485001 0.485084 0.485970 0.486643 0.486728 0.486829 0.486870 0.487044 0.487049 0.487250 0.487410 0.487629 0.487824 0.487997 0.488855 0.489101 0.489145 0.489178 0.489629 0.489894 0.490176 0.490995 0.491076 0.491184 0.491238
    101  0.475775 0.483058 0.483985 0.488356 0.515395 0.523914 0.524276 0.525544 0.525619 0.527592 0.527865 0.531722 0.532266 0.533842 0.534106 0.534494 0.534710 0.535068 0.535227 0.535403 0.535968 0.539388 0.539521 0.540071 0.540137 0.540346 0.540606 0.540983 0.541128 0.541501 0.541594 0.543101 0.543244 0.544333 0.544676 0.547421 0.547740 0.548519 0.549057 0.550086 0.550891 0.550918 0.551350 0.552062 0.552167 0.552595 0.552921 0.552931 0.553002 0.553128 0.553579 0.553580 0.553632 0.553831 0.553906 0.554972 0.555016 0.555189 0.555757 0.556157 0.556637 0.556741 0.557800 0.558196 0.558407 0.558473 0.558889 0.558915 0.559152 0.559307 0.559328 0.559593 0.559913 0.560179 0.560191 0.560247 0.560631 0.560835 0.560936 0.562285 0.562387 0.562430 0.563122 0.563408 0.563417 0.563474 0.563697 0.564059 0.564139 0.564146 0.564514 0.564593 0.564667 0.564727 0.564962 0.565013 0.565359 0.565456 0.565866 0.566001
    102  0.385728 0.400983 0.415554 0.427997 0.436546 0.438477 0.441108 0.443113 0.443529 0.444982 0.446680 0.447213 0.448154 0.450574 0.450580 0.452586 0.453520 0.454305 0.454607 0.458802 0.460905 0.462330 0.462559 0.464256 0.464571 0.465196 0.465545 0.466021 0.466094 0.466711 0.468317 0.468507 0.468647 0.469684 0.470379 0.471426 0.471779 0.472055 0.473018 0.473090 0.474332 0.474586 0.474803 0.476291 0.476357 0.476495 0.476506 0.476925 0.477115 0.478041 0.478673 0.479119 0.479500 0.479744 0.480130 0.481177 0.481182 0.481262 0.481568 0.482074 0.482504 0.482700 0.482987 0.483684 0.484006 0.484646 0.485080 0.485495 0.485640 0.485796 0.485948 0.486650 0.486975 0.487293 0.487372 0.487506 0.487538 0.487726 0.487750 0.488065 0.488082 0.488506 0.488925 0.489100 0.489255 0.489349 0.489889 0.489894 0.490113 0.490275 0.490345 0.490761 0.490907 0.491727 0.492575 0.492746 0.492874 0.492961 0.492973 0.493383
    103  0.356750 0.363257 0.369629 0.370084 0.370727 0.371859 0.372722 0.373987 0.374144 0.374811 0.375848 0.383199 0.386283 0.386852 0.391451 0.392506 0.393017 0.393243 0.393602 0.393625 0.393785 0.393916 0.394118 0.394210 0.394431 0.396134 0.396834 0.397242 0.399417 0.400385 0.400993 0.401482 0.401704 0.402099 0.403193 0.404154 0.404794 0.405425 0.405676 0.406111 0.407203 0.408099 0.409558 0.410603 0.411008 0.411285 0.411555 0.411788 0.412130 0.412611 0.412878 0.413386 0.413612 0.414645 0.414811 0.414906 0.415818 0.416532 0.416644 0.416761 0.416954 0.417108 0.417368 0.417491 0.417580 0.418242 0.418546 0.418727 0.419243 0.419374 0.419390 0.419613 0.420351 0.420513 0.420666 0.420996 0.421411 0.421497 0.421724 0.422152 0.422188 0.422904 0.423351 0.423453 0.423696 0.423976 0.424088 0.424484 0.424506 0.424726 0.424946 0.425059 0.426352 0.426358 0.426959 0.426964 0.427425 0.427782 0.427824 0.428368
    104  0.493989 0.495094 0.496214 0.501521 0.502341 0.503547 0.505571 0.507781 0.507944 0.509352 0.509905 0.510133 0.510683 0.511022 0.512300 0.512408 0.513213 0.513823 0.514521 0.515169 0.516970 0.517088 0.517323 0.517662 0.517919 0.518040 0.519932 0.520037 0.520771 0.521763 0.522048 0.523256 0.523301 0.524543 0.524634 0.524706 0.525410 0.525797 0.526500 0.526835 0.526909 0.527746 0.528261 0.528291 0.529202 0.529829 0.529898 0.530417 0.530445 0.531685 0.532289 0.533082 0.533407 0.533475 0.533534 0.533947 0.534070 0.534495 0.534554 0.534575 0.534599 0.534629 0.534814 0.535181 0.535362 0.535422 0.535678 0.536016 0.536065 0.536144 0.536257 0.536677 0.536809 0.536882 0.537407 0.537850 0.538113 0.538587 0.538605 0.538946 0.538998 0.539320 0.539708 0.539783 0.539843 0.540260 0.540291 0.540311 0.540742 0.541152 0.541329 0.541630 0.541935 0.542250 0.542255 0.542756 0.543294 0.543490 0.543542 0.543543
    105  0.059655 0.225059 0.393270 0.394482 0.399347 0.400184 0.400759 0.411775 0.413712 0.415127 0.415517 0.415808 0.419091 0.419717 0.423852 0.424943 0.425077 0.425856 0.426388 0.427385 0.430384 0.430652 0.430788 0.430985 0.432038 0.433459 0.434254 0.436419 0.437108 0.437458 0.437732 0.437842 0.438019 0.438138 0.438815 0.438884 0.439130 0.439170 0.439258 0.440495 0.441922 0.442054 0.442313 0.443480 0.443699 0.444162 0.444923 0.445346 0.445978 0.446774 0.447412 0.448968 0.449313 0.449722 0.449930 0.449958 0.450085 0.450213 0.450215 0.451147 0.451252 0.451444 0.451517 0.451652 0.452439 0.454184 0.454758 0.454796 0.455256 0.455441 0.455609 0.455655 0.455707 0.455744 0.455882 0.456066 0.456187 0.456333 0.456856 0.456858 0.456965 0.457624 0.457898 0.458173 0.458263 0.458300 0.458777 0.458788 0.458795 0.459078 0.459190 0.459557 0.459931 0.459985 0.460061 0.460821 0.461370 0.461568 0.461637 0.461948
    106  0.398196 0.403404 0.406747 0.408753 0.422984 0.425433 0.432938 0.444479 0.445255 0.445311 0.445448 0.448407 0.449570 0.450184 0.450780 0.455626 0.459999 0.460140 0.461693 0.463608 0.463813 0.465993 0.467729 0.468602 0.469560 0.471169 0.472867 0.474961 0.476268 0.478004 0.478163 0.484994 0.486224 0.486310 0.486364 0.486436 0.487942 0.487961 0.488001 0.489384 0.489589 0.490194 0.490895 0.491780 0.496472 0.496516 0.496628 0.496694 0.497012 0.497355 0.497721 0.498268 0.498498 0.498617 0.498790 0.499499 0.499502 0.500670 0.502026 0.503112 0.503606 0.504127 0.504222 0.504623 0.504635 0.505215 0.505267 0.505294 0.505357 0.506122 0.506175 0.506600 0.507007 0.507075 0.507375 0.507579 0.509480 0.509562 0.509690 0.509944 0.510216 0.510278 0.510481 0.510510 0.510739 0.511091 0.511433 0.511669 0.511771 0.512218 0.512721 0.512761 0.513174 0.513334 0.513479 0.513502 0.513704 0.513880 0.514139 0.514244
    107  0.260315 0.272421 0.279670 0.326371 0.329210 0.330805 0.333230 0.340073 0.342184 0.343259 0.344205 0.345296 0.347813 0.351123 0.351356 0.354174 0.361450 0.361700 0.365837 0.365929 0.367705 0.367888 0.369286 0.369849 0.371256 0.371842 0.372543 0.374391 0.374487 0.374612 0.375569 0.376644 0.376912 0.377805 0.378203 0.378275 0.378488 0.380528 0.381257 0.382926 0.383315 0.383365 0.387100 0.387524 0.387899 0.387911 0.388158 0.388186 0.388966 0.389022 0.390219 0.390227 0.390415 0.391048 0.391221 0.391724 0.391909 0.392490 0.392822 0.393125 0.393611 0.393864 0.394030 0.394050 0.394398 0.394442 0.394844 0.395852 0.396299 0.396484 0.396668 0.397208 0.398463 0.400408 0.401141 0.402326 0.402337 0.402578 0.404015 0.404778 0.405085 0.405217 0.405217 0.405378 0.405525 0.405895 0.405971 0.406047 0.406646 0.406975 0.407214 0.407368 0.407683 0.407877 0.407960 0.408529 0.408587 0.408904 0.408979 0.409604
    108  0.194440 0.214978 0.233690 0.234333 0.254817 0.261421 0.278243 0.278556 0.285316 0.289681 0.290050 0.292147 0.306280 0.307626 0.311265 0.315171 0.316352 0.317717 0.317804 0.319048 0.324618 0.325537 0.326381 0.335467 0.341606 0.346951 0.355007 0.355460 0.359216 0.360338 0.366196 0.370089 0.370713 0.373896 0.375631 0.393134 0.393213 0.397041 0.400106 0.404040 0.405288 0.405472 0.414028 0.417022 0.420004 0.420419 0.421620 0.422018 0.422941 0.422993 0.426463 0.427506 0.427689 0.427872 0.428768 0.431367 0.431792 0.431845 0.434444 0.435326 0.435670 0.436411 0.436550 0.438352 0.439936 0.440564 0.440749 0.440903 0.442177 0.442340 0.443327 0.443682 0.443744 0.444862 0.445120 0.445654 0.446121 0.446319 0.446901 0.447779 0.448934 0.448980 0.449060 0.449876 0.451381 0.451488 0.452513 0.452530 0.452750 0.453047 0.453370 0.453710 0.453937 0.454333 0.454801 0.455110 0.455242 0.455262 0.455429 0.455502
    109  0.287755 0.320960 0.379436 0.386656 0.391477 0.391852 0.406674 0.410385 0.410636 0.411019 0.411089 0.411203 0.412924 0.413023 0.413267 0.413963 0.414104 0.414491 0.416043 0.416813 0.418371 0.418403 0.420243 0.420520 0.421116 0.421635 0.422401 0.422947 0.422997 0.423178 0.424832 0.424972 0.425246 0.427695 0.427947 0.428555 0.429097 0.429156 0.429811 0.429897 0.429931 0.430458 0.430599 0.430729 0.430996 0.431748 0.432022 0.432026 0.432341 0.432754 0.432873 0.432928 0.433086 0.433284 0.433525 0.433830 0.433879 0.434067 0.434504 0.434848 0.435137 0.435440 0.435736 0.435936 0.436907 0.437796 0.438688 0.438807 0.439640 0.439680 0.439909 0.440399 0.440437 0.440677 0.440819 0.440875 0.440884 0.441286 0.441313 0.441397 0.441562 0.441586 0.441606 0.441607 0.442047 0.442095 0.442284 0.442419 0.442693 0.442928 0.442931 0.443013 0.443432 0.443538 0.443677 0.443693 0.443824 0.444243 0.444345 0.444650

以上です。