浮点
浮点运算中间值
在许多计算机上,使用较高精度的运算并不比使用较低精度的运算耗费的时间长,所以为内部的临时变量采用机器允许的最高精度对于数值运算是有意义的。这里采用的哲学是不强求语言为统一而采用各种硬件的最低精度,从而充分利用目标硬件的最佳性能。对于浮点运算表达式的中间值来说,可能会使用高于表达式类型所要求的精度。操作数的类型只决定最低精度而不是最高精度。实现注记:例如,在 Intel x86 机器上,计算的中间步骤最好(但不是必需)使用硬件提供的全部 80 位精度。
如果临时变量和公共子表达式的使用量很大的话,优化后的代码很可能会得到比未优化代码更精确的解。
算法应该以计算的最小精度为基础。如果实际的精度更高,它们也不应该退化或者失败。同扩展类型不同,float 或者 double 类型应该用于:
- 减少大型数组的内存消耗
- 维持同 C 的数据和函数参数的兼容性
负数和虚数类型
在现有的语言中,为了将复数类型添加到现存类型体系中可谓费尽周折:模板、结构、运算符重载等等,并且最终的结果几乎都是失败。失败的原因可能是由于复数运算的语义很微妙,是由于编译器不理解程序员想要做什么,因而无法对语义的实现进行优化。所有这些的目的都只是为了避免加入一个新类型。添加一个新类型意味着编译器可以使所有的复数语义工作“正常”。然后程序员就可以依靠复数的正确(至少是稳定)的实现。
伴随而来的是对虚数的需求。虚数类型是我们可以避开一些微妙的语义问题,并且由于不用处理隐含的 0 实部,可以提高运算的性能。
虚数文字量有一个 i 作为后缀:
ireal j = 1.3i;复数文字量没有自身特殊的语法,只需写成实数类型和虚数类型相加即可:
cdouble cd = 3.6 + 4i; creal c = 4.5 + 2i;复数有两个属性:
.re 实数部分 .im 虚数部分例如:
cd.re 是 4.5 double cd.im 是 2 double c.re 是 4.5 real c.im 是 2 real
取整控制
IEEE 754 浮点数算术包括了设置四种不同的取整模式的能力。D 加入了支持它们的语法:[blah, blah, blah] [注记:也许使用标准库更好]异常标志
IEEE 754 浮点数算术可以为计算中发生的事件设立标志:[blah, blah, blah] 这些标志可以使用如下如法设置/重置:[blah, blah, blah] [注记:也许使用标准库更好]浮点比较
除了常用的 <、<=、>、>=、== 和 != 比较运算符外,D 另外提供了专用于浮点数的运算符。它们是 !<>=、<>、<>=、!<=、!<、!>=、!> 和 !<>,并符合 C 扩展 NCEG 的语义。浮点数比较运算符 运算符关系 无效? 描述 > < = ? < F T F F yes 小于 > T F F F yes 大于 <= F T T F yes 小于或等于 >= T F T F yes 大于或等于 == F F T F no 等于 != T T F T no 未定义、小于或大于 !<>= F F F T no 未定义 <> T T F F yes 小于或大于 <>= T T T F yes 小于、等于或大于 !<= T F F T no 未定义或大于 !< T F T T no 未定义、大于或等于 !>= F T F T no 未定义或小于 !> F T T T no 未定义、小于或等于 !<> F F T T no 未定义或等于