NEUROMANTIC

自分でC/C++/UE4/Graphics/ゲームなどをやったことをメモするブログ

nlohmann::json「JSON for Modern C++」の浮動小数点数の減らし方のメモ

はじめに

github.com

nlohmann氏のJSONライブラリである「JSON for Modern C++」はC++環境でのJSONシリアルライズ文字列を読み込みするときに有用に使えるライブラリです。 速度面としては「RapidJSON」のようなライブラリには勝てないんですが、STLの操作面をよく真似していて使いやすいです。

しかし大量の浮動小数点数をシリアルライズ化しようとすると、規約上小数点以下10単位まで書くようになっていてファイルの容量がだいぶ大きくなります。

f:id:neuliliilli:20190125014729p:plain
小数点以下が10単位となってひどくなる

ここでは「JSON for Modern C++」ライブラリを利用しながら浮動小数点の小数点以下単位を抑える方法を書きたいと思います。

やり方

  1. ライブラリのjson_fwd.hppを開ける。
f:id:neuliliilli:20190125015048p:plain
  1. 最終ラインのusing json...を以下のように書き直す。
/*!
@brief default JSON class

This type is the default specialization of the @ref basic_json class which
uses the standard template types.

@since version 1.0.0
*/
//using json = nlohmann::basic_json<>;
using json = nlohmann::basic_json<
  std::map, std::vector, std::string, bool, std::int64_t, std::uint64_t, float>

最後の型引数としてfloatを書くことで、浮動小数点数をfloatとして取り扱うようにします。これにより、シリアルライズする時に余計な小数点がつかないようになります。

f:id:neuliliilli:20190125015645p:plain
小数点以下の表現が縮まったのが見える

まとめ

floatを使うことと、既存のdoubleを使った時の容量の差は以下の画像で見れます。

f:id:neuliliilli:20190125015457p:plain
「크기」は「容量」です。