繁体   English   中英

C ++标准是否在浮点数表示中指定了任何内容?

[英]Does the C++ standard specify anything on the representation of floating point numbers?

对于类型T针对std::is_floating_point<T>::valuetrue ,不C ++标准指定的道路上任何T应当执行?

例如, T是否必须遵循符号/尾数/指数表示? 还是可以完全武断?

从N3337:

[basic.fundamental/8]:共有三种浮点类型:float,double和long double。 double类型至少提供与float一样高的精度,long long类型提供至少与double一样高的精度。 float类型的值集是double类型的值集的子集; double类型的值集是long double类型的值集的子集。 浮点类型的值表示形式是实现定义的 整数和浮点类型统称为算术类型。 标准模板std :: numeric_limits(18.3)的专业化应为实现指定每种算术类型的最大值和最小值。

如果要检查实现是否使用IEEE-754,则可以使用std::numeric_limits::is_iec559

static_assert(std::numeric_limits<double>::is_iec559,
              "This code requires IEEE-754 doubles");

有许多在这一领域的其他辅助性的特征,如has_infinityquiet_NaN更多

C标准具有一个“附件”(在C11中为附件F),列出了实现C符合IEEE 754的后继标准IEC 60559的含义。符合附件F的实现必须具有IEEE -表示浮点数。 但是,实施本附件是可选的; 核心标准特别避免说任何有关浮点数表示的事情。

我不知道是否有C ++的等效附件。 它没有出现在N3337中,但这可能意味着它是单独分发的。 std::numeric_limits<floating-type>::is_iec559存在表明C ++委员会至少对此std::numeric_limits<floating-type>::is_iec559 考虑 ,但可能不像C委员会那样详细。 (一直以来,总是很遗憾,C ++标准未表示为对C标准的一组编辑。)

不需要特定的实现。 C ++标准根本不讨论它。 C标准非常详细地介绍了为浮点数假设的概念模型,并在一些底数b带有符号,指数,有效位数,依此类推。 但是,它特别指出,这仅是描述性的,而不是对实现的要求(C11,脚注21):

浮点模型旨在澄清每个浮点特性的描述,并且不需要实现的浮点算法相同。

这就是说,虽然细节可以改变,至少它随便在我看来,生产(例如)的一致性实现double未与通常的模式(即有效数字和指数)配合相当密切的将是困难的(或至少很难与竞争绩效挂钩)。 但是,以其他方式改变它并不是特别困难,例如重新排列顺序或使用不同的基数。

std::numeric_limits<T>::digits (和std::numeric_limits<T>::digits10 )的定义直接暗示着,浮点类型列出的所有数字必须(至少近似)保持相同的精度。在相当大的范围内。 到目前为止,最明显的实现方法是将一定数量的位/位数分配给一个有效位数,而将其他一些(单独的)位分配给一个指数。

std::is_floating_point的想法是使不同来源的用户代码更好地协同工作。 从技术上讲,您可以将int指定为std::is_floating_point而不会引起未定义的行为。 但是说您有一些模板库,必须重复除以T n 为了加快处理速度,库创建了一个T ni = 1 / n并用乘以ni替换除n 这对浮点数很有用,但对整数则无效。 因此,该库仅在std::is_floating_point<T>::value == true时才正确执行优化。 如果您撒谎,那么从标准的角度来看,该代码可能仍然可以使用,但是从逻辑的角度来看,这是不正确的。 因此,如果编写的类的行为类似于较大的float则将其标记为std::is_floating_point ,否则不要这样做。 这应该为您提供最佳代码和正确代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM