给定一个潜在的巨大整数值(采用C#字符串格式),我希望能够生成其十六进制等效值.普通方法在这里不适用,因为我们正在谈论任意大数,50位或更多.我见过的技术使用了这样的技术:
// Store integer 182
int decValue = 182;
// Convert integer 182 as a hex in a string variable
string hexValue = decValue.ToString("X");
// Convert the hex string back to the number
int decAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
Run Code Online (Sandbox Code Playgroud)
将无法工作,因为要转换的整数太大.
例如,我需要能够像这样转换字符串:
843370923007003347112437570992242323
到十六进制当量.
这些不起作用:
我正在尝试编写一个计算十进制数字的程序?到1000位数或更多。
为了有趣地进行低级编程,最终程序将以汇编形式编写在没有乘法或除法且仅执行16位加法的8位CPU上。为了简化实现,希望只能使用16位无符号整数运算,并使用迭代算法。速度不是主要问题。快速乘法和除法不在此问题的范围内,因此也不要考虑这些问题。
在进行汇编之前,我仍在尝试在台式计算机上的C语言中找到可用的算法。到目前为止,我发现以下系列相当有效并且相对容易实现。
该公式是使用收敛加速技术从Leibniz系列推导而来的,要推导该公式,请参见Carl D.Offner撰写的《计算?中的数字》(https://cs.umb.edu/~offner/files/pi.pdf) ,第19-26页。最终公式显示在第26页。我编写的初始公式有错别字,请刷新页面以查看固定公式。2第54页中解释了最大术语中的常数项。该白皮书还介绍了一种高级迭代算法,但是我在这里没有使用它。
如果一个人使用许多(例如5000)项来评估该系列,则有可能获得千位数的?。容易,并且我发现使用此算法,该系列也易于迭代评估:
用2填充数组以开始第一次迭代,因此新公式类似于原始公式。
让carry = 0。
从最伟大的任期开始。从数组中获得一项(2),将其乘以PRECISION对进行定点除法2 * i + 1,然后将提示作为新项保存到数组中。然后添加下一项。现在递减i,转到下一学期,重复直到i == 1。最后加上最后一项x_0。
由于使用的PRECISION是16位整数10,因此,将获得2个十进制数字,但只有第一个数字有效。将第二个数字另存为进位。显示第一个数字加进位。
x_0 是整数2,不应为后续迭代添加整数,将其清除。
转到第4步,计算下一个十进制数字,直到获得所需的所有数字为止。
将此算法转换为C:
#include <stdio.h>
#include <stdint.h>
#define N 2160
#define PRECISION 10
uint16_t terms[N + 1] = {0};
int main(void)
{
/* initialize the initial terms */
for (size_t i = 0; i < N …Run Code Online (Sandbox Code Playgroud) c algorithm fixed-point numerical-computing mathematical-expressions
TLDR,在底部:)
简介: 我正在创建一个用于处理大量数字的基本算术库(加法,减法...)。我面临的问题之一是将这些巨大的二进制数打印为十进制。
我在uint64_t数组中存储了巨大的二进制数。例如
uint64_t a[64] = {0};
Run Code Online (Sandbox Code Playgroud)
现在,目标是在控制台/文件中打印64 * 64位二进制数作为其十进制值。
初始工作: 为了阐述这个问题,我想描述如何打印十六进制值。
int i;
int s = 1;
a[1] = (uint64_t)0xFF;
for(i = s; i>= 0; i--)
{
printf("0x%08llX, ", a[i]);
}
Run Code Online (Sandbox Code Playgroud)
输出:
0x000000FF, 0x00000000,
Run Code Online (Sandbox Code Playgroud)
同样,对于打印OCT值,我只能从a [64]中取LSB 3位,打印与这些位等效的十进制数,向右移3位a [64]的所有位,并继续重复直到a [64]的所有值都已打印。(以反转顺序打印,以使第一个十进制数字保持在右侧)
我可以通过重复此单位算法来打印大小不受限制的二进制十六进制和十进制值,但是我找不到/开发一个十进制的值,可以重复一遍以打印a [64](或更大的值)。
我想到的是: 我最初的想法是继续减去
max_64 =(uint64)10000000000000000000; //(i.e.10^19)
Run Code Online (Sandbox Code Playgroud)
uint64_t内部最大的10的倍数,a直到内部的值a小于max_64(基本上等于rem_64 = a%max_64),然后使用以下命令打印rem_64值
printf("%019llu",rem_64);
Run Code Online (Sandbox Code Playgroud)
这是数字的第19个十进制数字a。
然后执行类似于(不是代码)的算术运算:
a = a/max_64; /* Integer division(no fractional part) to remove right most 19 dec digits from 'a' */ …Run Code Online (Sandbox Code Playgroud) 我在理解浮点类型的精度时遇到问题。msdn将该精度写入6 到 9 位数字。但我注意到精度取决于数字的大小:
float smallNumber = 1.0000001f;
Console.WriteLine(smallNumber); // 1.0000001
bigNumber = 100000001f;
Console.WriteLine(bigNumber); // 100000000
Run Code Online (Sandbox Code Playgroud)
smallNumber 比 big 更精确,我了解 IEEE754,但我不明白 MSDN 如何计算精度,这是否有意义?
此外,您可以在此处使用浮点格式的数字表示。请在“您输入”输入中输入 100000000 值,然后单击右侧的“+1”。然后将输入的值更改为 1,并再次单击“+1”。您可能会看到精度上的差异。