Tag: 精度

-1.0和1.0之间的双倍精度是多少?

在我看过的一些音频库中,音频样本通常表示为double或float,范围为-1.0到1.0。 在某些情况下,这很容易让分析和综合代码抽象出底层数据类型实际可能是什么(签名long int,unsigned char等)。 假设IEEE 754,我们的密度不均匀。 随着数量接近零,密度增加。 这意味着我们对接近-1和1的数字的精度较低。 如果我们可以为我们要转换的基础数据类型表示足够数量的值,则此非均匀数密度无关紧要。 例如,如果底层数据类型是unsigned char,我们只需要介于-1和1(或8位)之间的256个值 – 使用double显然不是问题。 我的问题是:我有多少精度? 我可以安全地转换为32位整数,而不会丢失吗? 为了扩展这个问题,在没有丢失的情况下,安全地转换为32位整数/从32位整数转换的值必须是多少? 谢谢!

打印__float128,不使用quadmath_snprintf

在我关于32位十进制数的浮点/双精度分析的问题中,一个答案说要看一下__float128 。 我使用它,编译器可以找到它,但我无法打印它,因为编译器找不到标题quadmath.h 。 所以我的问题是: __float128是标准的,对吗? 怎么打印? 是不是quadmath.h标准? 这些答案没有帮助: 使用extern C C ++精度 印花 裁判也没有帮助。 请注意,我不想使用任何非标准库。 [编辑] 如果这个问题有答案,即使答案是否定的,也会有用。

在整数中获取double值的小数部分而不会丢失精度

我想将double值的小数部分转换为精度,最多4位数转换为整数。 但是当我这样做时,我会失去精确度。 有什么方法可以让我获得精确的价值吗? #include int main() { double number; double fractional_part; int output; number = 1.1234; fractional_part = number-(int)number; fractional_part = fractional_part*10000.0; printf(“%lf\n”,fractional_part); output = (int)fractional_part; printf(“%d\n”,output); return 0; } 我期待输出为1234但它给出1233.请建议一种方式,以便我可以获得所需的输出。 我想用C语言的解决方案。

基于X3.9-1978标准的最佳IEEE 754-1985表示

根据DICOM标准,可以使用十进制字符串的值表示来存储一种浮点。 见表6.2-1。 DICOM价值表示 : 十进制字符串:表示固定点编号或浮点数的字符串。 固定点数应仅包含字符0-9,可选的前导“+”或“ – ”和可选的“。”。 标记小数点。 浮点数应按ANSI X3.9的规定传送,带有“E”或“e”表示指数的开始。 十进制字符串可以用前导或尾随空格填充。 不允许嵌入空格。 “0” – “9”,“+”,“ – ”,“E”,“e”,“。” 和默认字符保留曲目的SPACE字符。 最多16个字节 所以我很想简单地使用64位double ( IEEE 754-1985 )来表示我的C代码中的内存值,这是基于输入最多存储16个字节的事实。 那些对X3.9-1978更多了解的人X3.9-1978证实这是最好的表示(与arbitrary-precision , float和/或long double arbitrary-precision相比)吗? 最好的,我的意思是表示往返读/写将在视觉上无损 。 我应该能够从磁盘读取这样的ASCII浮点表示,将其放入内存,并将其写回磁盘(如上所述),与原始值(尽可能为机器epsilon)相比具有最大精度。 有关如何将double精度表示为只有16个字节的存储空间的实际实现细节超出了本问题的范围,请参阅此处了解详细信息。

如何修复错误代码C4146“unary减运算符应用于unsigned type.result仍未签名”?

数据类型int的最小值为-2,147,483,648。 所以,我输入了 int val = -2147483648; 但是,它有一个错误: unary minus operator applied to unsigned type.result still unsigned 我该如何解决?

在有限的16字节字符串上写入IEEE 754-1985 double作为ASCII

这是我原帖的后续内容 。 但为了清楚起见,我会重复一遍: 根据DICOM标准,可以使用十进制字符串的值表示来存储一种浮点。 见表6.2-1。 DICOM价值表示 : 十进制字符串:表示固定点编号或浮点数的字符串。 固定点数应仅包含字符0-9,可选的前导“+”或“ – ”和可选的“。”。 标记小数点。 浮点数应按ANSI X3.9的规定传送,带有“E”或“e”表示指数的开始。 十进制字符串可以用前导或尾随空格填充。 不允许嵌入空格。 “0” – “9”,“+”,“ – ”,“E”,“e”,“。” 和默认字符保留曲目的SPACE字符。 最多16个字节 标准是说文本表示是固定点与浮点。 该标准仅涉及在DICOM数据集本身中如何表示值。 因此,不需要将定点文本表示加载到定点变量中。 所以现在很明显,DICOM标准暗示推荐double (IEEE 754-1985)表示Decimal String类型的Value Representation (最多16位有效数字)。 我的问题是如何使用标准CI / O库将这个二进制表示从内存转换回ASCII到这个有限大小的字符串? 从互联网上的随机来源来看,这是非常重要的,但普遍接受的解决方案是: printf(“%1.16e\n”, d); // Round-trippable double, always with an exponent 要么 printf(“%.17g\n”, d); // Round-trippable double, shortest possible 当然,在我的情况下,两个表达式都是无效的,因为它们可以产生比我有限的最大16个字节更长的输出。 那么, […]

printf和scanf如何处理浮点精度格式?

请考虑以下代码段: float val1 = 214.20; double val2 = 214.20; printf(“float : %f, %4.6f, %4.2f \n”, val1, val1, val1); printf(“double: %f, %4.6f, %4.2f \n”, val2, val2, val2); 哪个输出: float : 214.199997, 214.199997, 214.20 | <- the correct value I wanted double: 214.200000, 214.200000, 214.20 | 我知道214.20有一个无限的二进制表示。 第一行的前两个元素具有预期值的近似值,但最后一个元素似乎根本没有近似值,这引出了以下问题: scanf , fscanf , printf , fprintf (等)函数如何处理精度格式? 由于没有提供精度, […]

x86-64长双精度

在英特尔64位平台上,long double的实际精度是多少? 是80位填充到128或实际128位? 如果是前者,除了去gmp之外,还有其他选择来实现真正的128精度吗?

为什么C中的double会比C ++打印更少的十进制数字?

我在C中有这个代码,我已经宣布0.1为double。 #include int main() { double a = 0.1; printf(“a is %0.56f\n”, a); return 0; } 这是它打印的, a is 0.10000000000000001000000000000000000000000000000000000000 C ++中的代码相同, #include using namespace std; int main() { double a = 0.1; printf(“a is %0.56f\n”, a); return 0; } 这是它打印的, a is 0.1000000000000000055511151231257827021181583404541015625 有什么不同? 当我读到两个都被分配8个字节? C ++如何在小数位上打印更多数字? 另外,它怎么能到小数点55位? IEEE 754浮点只有52位的小数,我们可以得到15位十进制数的精度。 它以二进制forms存储。 为什么它的十进制解释存储更多?

是否可以在一个long int变量中存储2个32位值?

我想在一个long int变量中存储两个32位值。 你会如何在使用C的32位操作系统上执行此操作? 是否可以将数据存储在一个长long变量中? 如果是这样,那怎么办?