Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 任意精度浮点库的实现_C++_C_Assembly - Fatal编程技术网

C++ 任意精度浮点库的实现

C++ 任意精度浮点库的实现,c++,c,assembly,C++,C,Assembly,我必须实现任意精度的浮点库,所以指数和尾数必须是无限正整数。稍后,我必须使用处理器的x86功能创建加法和减法函数等。我必须使用C++/C(我可以使用汇编插入),我可以使用现成的库 一开始我有问题: 1.使用哪种类型存储无限大的正整数? 2.哪些库/函数将允许我使用处理器的功能,并将使用上述数据类型 使用哪种类型存储无限大的正整数 整数的向量。就像一个固定大小的整数由字节组成一样,这个大整数由更小的部分组成。但是,与固定大小的整数不同,向量可以任意增长(直到内存耗尽) 可以将向量包在C++中的自定

我必须实现任意精度的浮点库,所以指数和尾数必须是无限正整数。稍后,我必须使用处理器的x86功能创建加法和减法函数等。我必须使用C++/C(我可以使用汇编插入),我可以使用现成的库

一开始我有问题: 1.使用哪种类型存储无限大的正整数? 2.哪些库/函数将允许我使用处理器的功能,并将使用上述数据类型

  • 使用哪种类型存储无限大的正整数 整数的向量。就像一个固定大小的整数由字节组成一样,这个大整数由更小的部分组成。但是,与固定大小的整数不同,向量可以任意增长(直到内存耗尽)

    可以将向量包在C++中的自定义类型中,提供面向对象的接口。 2.哪些库/函数将允许我使用处理器的功能,并将使用上述数据类型

    如果创建自定义类型,其他库将无法直接支持它。但是,如果类提供兼容接口,则可以使用通用模板库

    例如,如果您提供了比较运算符和赋值运算符,那么使用标准库中的
    std::sort
    对自定义类对象进行排序应该没有问题

    我可以使用现成的图书馆


    这通常是个好主意。我建议您这样做。

    一个重要的考虑因素是,您将使用什么作为内部单位表示的基础。正如其他人所说,这可能是单个单元的向量,然后您可以使用在小学学到的“纸上”操作来处理这些单元。可能是一个结构,它为Mantasa和exponent分别保存向量,并为每个向量的符号设置标志。但是,这些单独的单位是什么呢

    这些操作的效率使这一选择更加有趣

    您可能认为使用字符和基数10是编写此代码的最简单方法,而读写函数非常简单!但实际上,处理器在每次处理一个十进制字节时效率很低。这是伟大的阅读中的数字,虽然!例如,执行56*37需要对“十进制”体系结构执行以下操作:

    • 6*7->42
    • 42/10->4
    • 42%10->2*
    • 5*7->35
    • 35/10->3
    • 35%10->5
    • 6*3->18
    • 18/10->1
    • 18%10->8
    • 5*3->15
    • 15/10->1
    • 15%10->5
    • 4+5+8->17
    • 17/10->1
    • 17%10->7*
    • 3+1+5+1->10
    • 10/10->1
    • 10%10->0*
    • 1+1->2
    • 2/10->0
    • 2%2->2*
    • 最后答案_u2; 0 7 2
    这是大量的乘法和除法运算,只有两位数

    您可能会认为使用整个字节0-255效率更高,而使用以256为基数的数学则更简单。尤其是当数字分割/10和%10步变成简单的移位和掩码时!但在十进制显示中读取和写入任意长度的数字要困难得多,如果您决定使用以2为基数的指数,这将变得更加困难

    在Base65536中执行相同的数学运算效率更高,而在64位处理器上使用Base4G进行数学运算效率更高,打印也不太复杂。使用汇编程序,您甚至可以使用64位存储和128位乘法操作

    每次将内部字长增加一倍时,乘法部分运算的数量就会减少4,而除法部分运算的数量则会更大

    一种提高打印效率并保持数学计算合理效率的欺骗方法是在每个存储单元中实际存储大量二进制数字。32位存储实际上可以在每个单元中保存一个长度不超过9位的整数。通过以10亿为基数进行数学运算,您只需每9位数执行上面所示的所有额外数字拆分操作

    在中读取数字字符串需要在存储器中一次读取9位数字,然后修复指数,我建议指数仍然是10的幂。数字应始终以标准化浮点格式在内部保存,其中小数点上方只有一位数字(或可能始终为0)。如果输入字符串包含位于不同位置的小数点,或者实际上是一个整数值,则可以通过修改指数值来修复它。数字总是以该格式或整数打印。这样,数字中未使用的数字总是位于最低有效单位的底部,如果它们为零,则它们完全可以工作

    在这个模式中,添加或减去两个具有不同指数的数字需要一些额外的工作,因为其中一个数字必须拆分为另一个数字的十亿对,然后才能求和,但与乘法或除法相比,加法仍然非常便宜

    将指数值本身读入保持向量是一件棘手的事情,但也许您可以使用限制在64位范围内的指数,这意味着您不必对指数数本身进行多字节操作?这允许数字高达0.99E10sextillion(这是一个仅用于指数的19位数字),这对于大多数用途来说应该足够了。这假设指数仍然表示10的幂,这使得值的存储更加方便,或者可以以数十亿的幂进行存储,以“指数”的方式增加范围,但是文本数字的读取更加困难