適切な方法は、任意の数値を表すクラスを忠実に使用することです。このような値を表現するには、任意の精度の整数クラスをスケール係数で使用できます。
#include <boost/multiprecision/cpp_int.hpp>
// numeric = value/pow(10, scale)
struct numeric {
/// arbitrary precision integer
boost::multiprecision::cpp_int value;
/// point position
int scale;
};
// for example, 10.1 can be represented with the numeric class exactlty in difference to double :
numeric n{101, 1}; // 101/pow(10, 1)
あなたははstdする::文字列、数値クラスのオブジェクトを変換するヘルパー関数を使用することができ、そのような番号を印刷するには:
std::string to_string(const numeric& n) const
{
if (n.value.is_zero() && n.scale <= 0)
return "0";
bool neg = n.value < 0;
std::string r;
{
std::ostringstream s;
s << (neg ? -n.value : n.value);
s.str().swap(r);
}
if (n.scale > 0) {
if (n.scale >= r.length()) {
r = std::string(n.scale - r.length() + 1, '0') + r;
}
r.insert(r.length() - n.scale, 1, '.');
if (neg)
r = '-' + r;
}
else if (n.scale < 0) {
if (neg)
r = '-' + r;
r += std::string(-n.scale, '0');
}
else {
if (neg)
r = '-' + r;
}
return std::move(r);
}
構築するために例えば、それは、以下のことのように定義することができますstd :: stringの数値オブジェクトです。ポイント位置(数値の位取り)を見つけ出し、ポイントを削除し、ポイント文字列からクリアしてcpp_intを初期化します。
* "テキストファイルから値を読み取り、それらをダブルに変換すると、これらの値を画面に出力する必要があります。これらはテキストファイルとまったく同じに見えるはずです。"数字を文字列として保存する必要があります。テキストファイルに基数10の数値が格納され、浮動小数点数がシステムに基底2として格納されていると仮定すると、送信先のコードにはソース番号を一度に表すことはできません。あなたは文字列を周りに保持する必要があります。これはまったく時期尚早の最適化であるため、スクラップして数字を文字列として保存します。それは**本当にシンプルです**。 – IInspectable
おそらくboost.multiprecisionを試すことができます。しかし、それらを文字列として格納するのが最も簡単な解決策かもしれません。 –
必要条件を満たすために最小限のメモリを使用する必要があるため、文字列では処理できません。S – nancyheidilee