【发布时间】:2018-11-08 01:39:15
【问题描述】:
科学记数法定义了应如何使用符号、数字和指数来显示数字,但它并没有说明可视化是标准化的。
举例:-2.34e-2(标准化科学记数法)与-0.234e-1(科学记数法)相同
我可以依赖以下代码始终产生标准化结果吗? 编辑:除了答案中指出的 NAN 和 INF。
template<typename T>
static std::string toScientificNotation(T number, unsigned significantDigits)
{
if (significantDigits > 0) {
significantDigits--;
}
std::stringstream ss;
ss.precision(significantDigits);
ss << std::scientific << number;
return ss.str();
}
如果是,请在 C++ 文档/标准中列出一个部分,说明它不是平台/实现定义的。由于 0 的值也以不同的方式表示,我担心某些非常小的数字(非规范化?!)可能会以不同的方式可视化。在我的编译器平台上,它目前适用于 std::numeric_limits::min()、denorm_min()。
注意:我使用它来查找数字的数量级,而不会弄乱浮点数分析的所有古怪细节。我希望标准库为我做这件事:-)
【问题讨论】:
-
如果您想要数量级,为什么不使用简单的
std::log10? -
因为这会产生错误的结果。一个例子:999.0f 的大小为 2。当用于公制前缀表示法时,这是错误的,因为您需要考虑有效数字。 3 个有效数字的大小为 2,但 2 个有效数字的大小为 3,因为该值四舍五入为 1000。简而言之:999.0f 有 2 个 sig 数字 ->“1.0k”,999.0f 有 3 个 sig 数字 ->“999”
-
“错误的结果” - 好吧,你应该在你的问题中添加你想要的东西。您可以随时使用对数/舍入和乘法来获得您想要的结果。
标签: c++ floating-point scientific-notation