任何软件将浮动转换为任何精度FPU? [或Matlab解决方案]

时间:2015-04-02 13:59:01

标签: matlab vhdl fpu

我想将很多浮点数转换为多精度FPU,例如' 0x4049000000 .....',执行计算,更改精度然后再执行计算等等......

我知道理论为here,但我想要一个软件,在线工具或Matlab解决方案,将6000+数字转换为FPU格式(如IEEE单精度),范围为0.0~51.0。

任何建议?

注意:我需要自定义精度,我可以用它来描述尾数和指数的位数。

编辑:它也称为与基数无关的浮点,如herehere所述

第二次编辑IEEE single precision convertIEEE double Precision convert就是例子。您输入任何浮点数,例如3.1454,您将获得二进制/十六进制的IEEE(单精度或双精度)浮点值。 @rick

2 个答案:

答案 0 :(得分:1)

快速浏览一下VHDL-2008浮点库float_pkg,可以看出它实例化了一个泛型包,其泛型参数设置为匹配IEEE单精度浮点数。

package float_pkg is new IEEE.float_generic_pkg (...)

您应该在模拟器安装过程中找到此库,无论您何时寻找标准库,例如numeric_std。在我的系统上,它位于/opt/ghdl-0.32/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/vhdl/src/ieee2008/float_pkg.vhdl - 如果您无法在系统上找到它,它可以在线获取,搜索" VHDL 2008浮动包"应该让你到那儿。

您可以为您喜欢的任何精度(在合理范围内)实例化此通用包(使用float_pkg作为示例)。

快速查看IEEE.float_generic_pkg表明它声明了函数to_floatto_real,我认为它们有明显的行为。

所以答案是......是的。

  -- real to float
  function to_float (
    arg                  : REAL;
    size_res             : UNRESOLVED_float;
    constant round_style : round_type := float_round_style;  -- rounding option
    constant denormalize : BOOLEAN    := float_denormalize)  -- Use IEEE extended FP
    return UNRESOLVED_float;

  -- float to real
  function to_real (
    arg                  : UNRESOLVED_float;  -- floating point input
    constant check_error : BOOLEAN    := float_check_error;  -- check for errors
    constant denormalize : BOOLEAN    := float_denormalize)  -- Use IEEE extended FP
    return REAL;

答案 1 :(得分:1)

应该只需要{p> float_pkg。它为您提供了一些预定义的浮点类型(例如,IEEE单精度和双精度),以及为分数和指数定义任意位数的自定义浮点值的能力。

根据您的数字示例,这里有一些代码可以从real值转换为单精度,双精度和四倍精度浮点数。

library ieee;
use ieee.float_pkg.all;

entity floating_point_demo is
end;

architecture example of floating_point_demo is
begin
    process
        variable real_input_value: real := 49.0215463456;
        variable single_precision_float: float32;
        variable double_precision_float: float64;
        variable quadruple_precision_float: float128;
    begin
        single_precision_float := to_float(real_input_value, single_precision_float);
        report to_string(single_precision_float);
        report to_hstring(single_precision_float);

        double_precision_float := to_float(real_input_value, double_precision_float);
        report to_string(double_precision_float);
        report to_hstring(double_precision_float);

        quadruple_precision_float := to_float(real_input_value, quadruple_precision_float);
        report to_string(quadruple_precision_float);
        report to_hstring(quadruple_precision_float);

        wait;
    end process;
end;

上面的示例使用float32中的float64float128float_pkg类型。但是,您可以使用float类型的对象实现相同的效果,其大小可以在其声明中定义:

variable single_precision_float: float(8 downto -23);
variable double_precision_float: float(11 downto -52);
variable quadruple_precision_float: float(15 downto -112);

要从float转换为real值,您可以使用to_real()函数:

-- To print the real value of a float object:
report to_string(to_real(quadruple_precision_float));

-- To convert from a float and assign to a real:
real_value := to_real(quadruple_precision_float);