主要内容

数量低于正常的执行速度

低于正常的数字,原名denormal在浮点数字文献,填补下溢的差距在零浮点算术。低于正常的值是一个特殊的类别太接近的浮点值0.0表示为一个规范化的价值。主要significand(尾数)低于正常的数量是零。当加减浮点数,防止下溢低能的数字。

使用低于正常的数据提供了精度超出正常用前导零表示有效数字代表到达最低指数较小的值后表示。价值趋向0.0为扩展范围,你权衡精度。低于正常的数据是有用的,如果您的应用程序需要额外的范围。

然而,在实时系统中,使用低于正常的数字能大大提高执行延迟,导致过度设计的利润率和实时超支。如果模拟或生成的代码执行计算,生成或使用低于正常的数据,执行这些计算可达50倍正常慢于类似的计算数字。弱智者的实际模拟或代码执行时间计算数量取决于你的电脑操作环境。通常,对于桌面处理器,低于正常的数量计算的执行时间是正常五倍低于类似的计算数字。

执行减速或超支的可能性最小化由于低能的数量计算延迟,做以下之一:

  • 在你的模型中,手动刷新任何传入或低于正常的计算值在零输入和关键操作,如褪色和过滤器。例如,看到的平低于正常的数字为零

    检测为一个精度低于正常价值,32位浮点数:

    1. 找到最小的规范化MATLAB数字®主机。在命令窗口中,输入:

      > > SmallestNormalSingle =最小正浮点数(单)
      在C语言中,FLT_MIN中定义的,float.h,相当于最小正浮点数(单)

    2. 寻找值范围:

      0 < fabsf (x) < SmallestNormalSingle

    检测一个低能的双精度值,64位浮点数:

    1. 找到最小的规范化在MATLAB主机数量。在命令窗口中,输入:

      > > SmallestNormalDouble =最小正浮点数(双)
      在C语言中,DBL_MIN中定义的,float.h,相当于最小正浮点数(双)

    2. 检测一个低能的价值,寻找在这个范围值:

      0 < < SmallestNormalDouble晶圆厂(x)

  • 设置模拟行为denormal数字参数平为零(保税区)模仿flush-to-zero行为denormal算术运算的结果。有关更多信息,请参见模拟行为denormal数字

  • 处理器,设置flush-to-zero模式,或者与你的编译器,指定一个选项来禁用低能的数字。Flush-to-zero模式治疗弱智者数量为0时输入一个浮点操作。下溢异常不发生在flush-to-zero模式。

    例如,在英特尔®处理器,flush-to-zero(保税区)和denormals-are-zero(戴兹)旗帜MXCSR寄存器控制浮点计算。gcc编译器在Linux上,-ffast-math集突然下溢(保税区),flush-to-zeroo3 -ffast-math恢复逐渐下溢,使用低于正常的数字。

有关更多信息,请参见IEEE®标准754,IEEE标准浮点算术

仿真时间和不低于正常的数字

这个例子展示了如何使用低于正常的数字增加了仿真时间~ 5倍。

对于这个示例,创建一个简单的模型ex_subnormal一个常数和增益块。增益设置为低于正常的价值最小正浮点数(双)/ 2

要运行一个模拟,在命令窗口中,类型k = 1:5,抽搐;sim (“ex_subnormal”);toc,结束。观察仿真弱智者使用的运行时间,类似如下:

> >k = 1:5,抽搐;sim卡(“ex_subnormal”);toc,结束运行时间9.909326秒。运行时间9.617966秒。运行时间9.797183秒。运行时间9.702397秒。运行时间9.893946秒。

将获得一个数字,2,这不是低能的值:

> > set_param (“ex_subnormal /增益”,“获得”,' 2 ');

要运行一个模拟,在命令窗口中,类型k = 1:5,抽搐;sim (“ex_subnormal”);toc,结束。观察仿真运行时间,不使用低于正常的价值观,类似如下:

> >k = 1:5,抽搐;sim卡(“ex_subnormal”);toc,结束运行时间2.045123秒。运行时间1.796598秒。运行时间1.758458秒。运行时间1.721721秒。运行时间1.780569秒。

平低于正常的数字为零

这个例子展示了如何冲单精度低于正常的数字为零。

  1. 对于这个示例,创建一个简单的模型ex_flush_to_zero

    • 重复序列楼梯生成一个数字序列从两个提高到0的力量通过两个提高到-165年的权力。序列接近零。

    • ConditionRealScalar冲弱智者小于单精度值最小正浮点数(单)为零。

    • MATLAB功能块log2生成以2为底的对数重复序列楼梯输出。具体地说,log2生成数字0到-165年。

      函数y = fcn (u)% # codegeny = log2 (u);结束

  2. 模拟>退一步>配置模拟步进面板:

    • 选择能够退一步

    • 选择暂停模拟当时间到达并输入121年

  3. 在模型窗口中,仿真运行。在模拟停顿T = 121。显示的值:

    • ConditionRealScalar输出趋于零。

    • 重复序列楼梯输出接近零。

  4. 仿真步向前T = 127ConditionRealScalar刷新输出低于正常的价值重复序列楼梯为零。

  5. 继续向前走仿真。ConditionRealScalar刷新输出低于正常的单精度值重复序列楼梯为零。当T = 150的输出重复Squence楼梯本身就是零。

相关的话题