问题标签 [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.
java - 在java中转换80位扩展精度
我正在开发一个程序,它将真正旧的 Open Access 4 .df 文件转换为其他格式并创建数据库脚本 - 我已经能够转换除十进制类型之外的所有可能类型。我发现字节顺序必须是 80 位扩展精度。我已经尝试自己进行转换,但我无法进行从 80 位扩展精度(https://en.wikipedia.org/wiki/Extended_precision#x86_Extended_Precision_Format)到字符串和字符串到 80 位扩展的转换Java中的精度。
- 例子:
价值:1,235
来自 df 文件的十六进制:40 00 9e 06 52 14 1e f0 db f6
- 例子:
价值: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
assembly - 寄存器中存储的数字有多大
这是一个基本问题,但假设我想将寄存器 $t2、$t3 和 $t4 中的 3 个数字相乘。假设每个寄存器只能容纳 8 位,当我们将三个数字相乘时,结果可能大于 8 位。如果它大于 8 位,如果每个寄存器只能保存 8 位,结果如何存储在寄存器 $t0 中?
assembly - 16 位 x 32 位的汇编乘法 => 48 位
假设我想在汇编中将一个大数乘以另一个(也许很小)数。大数(被乘数)保存在DX:AX
,乘数保存在BX
. 该MUL
指令仅对AX
. 那么该怎么办DX
呢?
例如,数字是0001:0000H
(65536),我想将它乘以 2。
因此结果为零!对此有任何想法吗?
assembly - 将一个 Dword 除以一个单词 nasm
我正在尝试DX:AX
用单词 [b]=10 对 1234567 中的 dword 进行有符号除法。
商应该是 123456,但它太大了,所以它不适合 ax。我应该怎么做才能解决这个问题?
delphi - 如何格式化 MinExtended80Denormal?
单位System.Math
定义常数
我可以使用给定的 rtl 函数将此数字转换为字符串吗?
我试过
这导致
000000000000000E+00000
我也尝试了更大的非规范化值,但似乎内置格式化函数不支持这些值(其中指数为零)。
algorithm - 将扩展(80 位)转换为字符串
如何将扩展精度浮点值转换为字符串?
背景
Intel CPU 支持三种浮点格式:
- 32 位单精度
- 64 位双精度
- 80 位扩展精度
Delphi 原生支持扩展精度浮点格式。
扩展精度分为:
- 1个符号位
- 15 个指数位
- 1 个整数部分位(即数字以
0.
or开头1.
) - 63 个尾数位
您可以将 Extended 的尾数大小与其他浮点类型的尾数大小进行比较:
Extended 具有比单双精度更高的精度。
例如,取实数.49999999999999999
,它的二进制表示:
您会看到,虽然Single和Double已被强制舍入到0.1 binary
(0.5 decimal) ,但 extended 仍然具有一定的精度。
但是如何将二进制分数转换为字符串?
如果我尝试将扩展值转换0.49999999999999998
为字符串:
函数返回0.5
,当我可以看到扩展内部并看到它不是0.5 时:
其他扩展值也是如此;Delphi 中的所有函数(我能找到)都返回 0.5:
什么功能?
FloatToStr和FloatToStrF都是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 ]字节)
在Digits
ascii 字符数组中:
- 指数:
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 浮点数转换为字符串的黑暗艺术。
有些部分很简单:
但困难的部分留作回答的练习。
奖金截图
c - 使用 32 位整数计算 64 位无符号整数乘法和减法
我有一个项目来计算 64 位无符号整数加法、乘法和减法,仅使用 c 中的 32 位有符号/无符号整数。64 位无符号整数新定义如下:
所以 64 位整数只是一个将高 32 位存储在高位,将低 32 位存储在低位的结构。
现在我得到这两个 Integer64 并且我还必须生成 Integer64 类型的乘法和减法。在乘法和减法函数中,我只允许使用 Integer64 类型,unsigned int 类型,并且只能使用整数算术和逻辑运算。
我解决了如何编写加法函数,但我不知道如何进行乘法和减法。你们能帮忙吗?
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,因为他们都在最后设置了进位标志)
assembly - 如何将两个数字相加,每个数字有 12 个字节?
我想添加两个具有 12 字节的数字并将结果存储在 16 字节的 var 中。我怎样才能做到这一点?
我想我可以将数字 1 的前 4 个字节数与数字 2 的前 4 个字节数相加,依此类推.. 但我不知道如何在我的结果变量中连接结果。如果需要,我该怎么做?这个解决方案是正确的吗?
algorithm - 在 8086 asm 中将 64 位数字乘以 32 位数字
即使启动问题的解决方案,我也遇到了问题。我曾尝试考虑乘法是重复加法算法,但无论我考虑什么算法,我似乎都专注于一个问题——8086 中的最大寄存器大小是 16 位。
…………填写代码…………
在这一点上,我被困住了。即使是轻微的代码提示或算法也将不胜感激。