问题标签 [extended-precision]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1015 浏览

java - 在java中转换80位扩展精度

我正在开发一个程序,它将真正旧的 Open Access 4 .df 文件转换为其他格式并创建数据库脚本 - 我已经能够转换除十进制类型之外的所有可能类型。我发现字节顺序必须是 80 位扩展精度。我已经尝试自己进行转换,但我无法进行从 80 位扩展精度(https://en.wikipedia.org/wiki/Extended_precision#x86_Extended_Precision_Format)到字符串和字符串到 80 位扩展的转换Java中的精度。

  1. 例子:

价值:1,235

来自 df 文件的十六进制:40 00 9e 06 52 14 1e f0 db f6

  1. 例子:

价值:0,750

来自 df 文件的十六进制:3f ff c0 00 00 00 00 00 00 00

也许有人可以帮助转换?

此致

@EJP 评论:好吧,我扔掉了最后 16 位,所以我得到了 3f ff c0 00 00 00 00 00 关于(Java - 将十六进制转换为 IEEE-754 64 位浮点数 - 双精度)我尝试将其转换为

但结果是 1,984375 而不是 0,750

0 投票
3 回答
1374 浏览

assembly - 寄存器中存储的数字有多大

这是一个基本问题,但假设我想将寄存器 $t2、$t3 和 $t4 中的 3 个数字相乘。假设每个寄存器只能容纳 8 位,当我们将三个数字相乘时,结果可能大于 8 位。如果它大于 8 位,如果每个寄存器只能保存 8 位,结果如何存储在寄存器 $t0 中?

0 投票
1 回答
15383 浏览

assembly - 16 位 x 32 位的汇编乘法 => 48 位

假设我想在汇编中将一个大数乘以另一个(也许很小)数。大数(被乘数)保存在DX:AX,乘数保存在BX. 该MUL指令仅对AX. 那么该怎么办DX呢?

例如,数字是0001:0000H(65536),我想将它乘以 2。

因此结果为零!对此有任何想法吗?

0 投票
1 回答
1452 浏览

assembly - 将一个 Dword 除以一个单词 nasm

我正在尝试DX:AX用单词 [b]=10 对 1234567 中的 dword 进行有符号除法。

商应该是 123456,但它太大了,所以它不适合 ax。我应该怎么做才能解决这个问题?

0 投票
1 回答
140 浏览

delphi - 如何格式化 MinExtended80Denormal?

单位System.Math定义常数

我可以使用给定的 rtl 函数将此数字转换为字符串吗?

我试过

这导致

000000000000000E+00000

我也尝试了更大的非规范化值,但似乎内置格式化函数不支持这些值(其中指数为零)。

0 投票
1 回答
2290 浏览

algorithm - 将扩展(80 位)转换为字符串

如何将扩展精度浮点值转换为字符串?

背景

Intel CPU 支持三种浮点格式:

Delphi 原生支持扩展精度浮点格式。

扩展精度分为:

  • 1个符号位
  • 15 个指数位
  • 1 个整数部分位(即数字以0.or开头1.
  • 63 个尾数位

您可以将 Extended 的尾数大小与其他浮点类型的尾数大小进行比较:

Extended 具有比单双精度更高的精度。

例如,取实数.49999999999999999,它的二进制表示:

您会看到,虽然SingleDouble已被强制舍入到0.1 binary(0.5 decimal) ,但 extended 仍然具有一定的精度。

但是如何将二进制分数转换为字符串?

如果我尝试将扩展值转换0.49999999999999998为字符串:

函数返回0.5,当我可以看到扩展内部并看到它不是0.5 时:

其他扩展值也是如此;Delphi 中的所有函数(我能找到)都返回 0.5:

什么功能?

FloatToStrFloatToStrF都是FloatToText的包装器。

FloatToText最终使用FloatToDecimal从扩展的记录中提取包含浮动片段的记录:

就我而言:

解码的浮点数返回为:

  • 指数:0 (SmallInt)
  • 负数:假(布尔值)
  • 数字: [53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] (数组[0..20 ]字节)

Digitsascii 字符数组中:

  • 指数: 0
  • 消极的: False
  • 数字: '5'

FloatToDecimal 限制为 18 位

扩展精度浮点数的 63 位尾数的精度可以下降到:

问题是:

  • Extended 可以为您提供最多 19 位的有意义的值
  • FloatToDecimal,虽然最多返回 20 位,但只接受并生成扩展值的最大 18 位请求(货币为 19 位)

对于文档:

对于 Extended 类型的值,Precision 参数指定结果中请求的有效数字位数——允许的范围是 1..18。
Decimals 参数指定结果中小数点左侧所请求的最大位数。
精度和小数共同控制结果的四舍五入方式。要生成始终具有给定有效数字位数的结果,而不管数字的大小,请为 Decimals 参数指定 9999。
转换的结果存储在指定的 TFloatRec 记录中,如下所示:

数字 - 最多包含 18 个(对于扩展类型)或 19 个(对于货币类型)有效数字,后跟一个空终止符。隐含的小数点(如果有)不存储在 Digits 中。

所以我遇到了内置浮点格式化函数的基本限制

如何格式化 80 位 IEEE 扩展精度浮点数?

如果 Delphi 不能自己做,那么问题就变成了:该怎么做?

我知道 Extended 是 10 个字节(SizeOf(Extended) = 10)。现在的问题深入研究了将 IEEE 浮点数转换为字符串的黑暗艺术。

有些部分很简单:

但困难的部分留作回答的练习。

奖金截图

在此处输入图像描述

0 投票
0 回答
401 浏览

c - 使用 32 位整数计算 64 位无符号整数乘法和减法

我有一个项目来计算 64 位无符号整数加法、乘法和减法,仅使用 c 中的 32 位有符号/无符号整数。64 位无符号整数新定义如下:

所以 64 位整数只是一个将高 32 位存储在高位,将低 32 位存储在低位的结构。

现在我得到这两个 Integer64 并且我还必须生成 Integer64 类型的乘法和减法。在乘法和减法函数中,我只允许使用 Integer64 类型,unsigned int 类型,并且只能使用整数算术和逻辑运算。

我解决了如何编写加法函数,但我不知道如何进行乘法和减法。你们能帮忙吗?

0 投票
1 回答
1130 浏览

assembly - 组装:增加 2(或更大的数字)而不破坏 ADC 循环中的 CF?

我正在尝试在 Windows 中测试 TDM-GCC 64 位程序集中的附加功能。不久前我搜索了这方面的资源,发现了一个类似的代码(我做了一些更改以在 TDM-GCC 中编译它)。

这第一个汇编代码有效。不利的一面是,即使对于小数字,它也需要与计算最大尺寸一样长的时间。因此,我改为检查 X 和 Y 的大小并放置一个具有大小条件的循环,这样如果 X 和 Y 不大,它就不必总是添加整个数组。

但是我太简单了,认为使用 ADDQ 运算符将 8 个字节添加到 X 和 Y 的地址 (%r13, %r14)就可以遍历数组。这里的问题是,如果我像这样使用 ADDQ 运算符,它将进位标志重置为 0,因此计算进位(.add3)加法的整个循环会中断。我尝试使用

思考 incq 的工作方式类似于在 C++ 中增加一个指针,该指针知道它应该移动多少字节。但这只会将寄存器值增加 1,而不是我认为它会移动的 8。


所以我的问题是:在汇编中有没有办法将寄存器增加大于 1 的数字,或者在不触及进位标志的情况下进行加法?(不加,adc,因为他们都在最后设置了进位标志)

0 投票
2 回答
508 浏览

assembly - 如何将两个数字相加,每个数字有 12 个字节?

我想添加两个具有 12 字节的数字并将结果存储在 16 字节的 var 中。我怎样才能做到这一点?

我想我可以将数字 1 的前 4 个字节数与数字 2 的前 4 个字节数相加,依此类推.. 但我不知道如何在我的结果变量中连接结果。如果需要,我该怎么做?这个解决方案是正确的吗?

0 投票
1 回答
839 浏览

algorithm - 在 8086 asm 中将 64 位数字乘以 32 位数字

即使启动问题的解决方案,我也遇到了问题。我曾尝试考虑乘法是重复加法算法,但无论我考虑什么算法,我似乎都专注于一个问题——8086 中的最大寄存器大小是 16 位。

…………填写代码…………

在这一点上,我被困住了。即使是轻微的代码提示或算法也将不胜感激。