C语言中,64位无符号整型如何进行开方运算?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中,64位无符号整型如何进行开方运算?相关的知识,希望对你有一定的参考价值。
简单办法,转double, 再开方。你的编译器要能全面支持64位无符号整型才行。例如支持 强制转化 unsigned _int64 为 double.
#include<stdio.h>
#include<math.h>
int main(void)
// unsigned _int64 x; // 我的编译器支持 支持unsigned
signed _int64 x;
double y;
printf("input x in hex 0x100:\n");
scanf("%I64x", &x); // 按16进制格式输入。
printf("x=%I64d\n", x); // 按10进制格式输出。
y = (double) x; // 我的编译器支持 signed _int64 转double, 不支持unsigned 转double
printf("y=%lf\n",sqrt(y)); // 开平方
return 0;
-----
scanf("%I64d", &x); // 按10进制格式输入。
============
实际上,double 只有 52 bits 精度,unsigned _int64 会有截断误差。
而 math.h 的sqrt 不支持 unsigned _int64。
也许可以自己编一个迭代 程序,假定 unsigned _int64 y 是平方根,用
(x - y * y ) 趋进 0 的方法 迭代 出 y -- 好像不难。达到 y 精度 为 1。
下面是设想,尚无时间验证:
#include<stdio.h>
#include<limits.h>
#include<math.h>
int main(void)
unsigned _int64 x,y,y1,y2;
signed _int64 xs;
double z;
printf("max signed _int64 is %I64x\n", _I64_MAX);
printf("max unsigned _int64 is %I64x\n", _UI64_MAX);
printf("input x in hex 0x100:\n");
scanf("%I64x", &x);
printf("x=%I64x\n", x);
if (x <= _I64_MAX)
xs = x;
z = (double) xs;
printf("y=%lf\n",sqrt(z));
else
for (y=0;y< 0xffffffff;y=y+0xff)
if (y*y <= x) y1=y;
if (y * y > x) y2=y; break;
for (y=y1;y<=y2;y=y++)
if (y*y <= x) y1=y;
if (y*y > x) y2=y; break;
printf("y1=%I64x y2=%I64x\n",y1,y2); // 输出
return 0;
输入数小于0x7fffffffffffffff 用 double
大于 0x7fffffffffffffff 用 y*y -x
输入输出 用 16 进制数。 参考技术A 你的意思是这样吗?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
int main()
unsigned __int64 a=100000000000000;
printf("%.10f\n", (double)sqrt(a));
return 0;
追问
不是的,谢谢你
参考技术B #include <stdio.h>#include <math.h>
int main(void)
unsigned int a=25;
printf("%g",sqrt(a));
return 0;
追问
你好,我的意识是对一个64位无符号整型进行开方运算
uint8是8位无符号整型,uint16是16位无符号整型。
uint8是8位无符号整型,uint16是16位无符号整型。
整型有无符号(unsigned)和有符号(signed)两种类型,在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。在一些不可能取值为负数的时候,可以定义为unsigned,在一些底层的嵌入式编程的数据一般都是无符号。
扩展资料:
负数时的有符号整型和无符号整型的转换
当执行一个运算时(如这里的a>b),如果它的一个运算数是有符号的而另一个数是无符号的,那么C语言会隐式地将有符号 参数强制类型为无符号数,并假设这两个数都是非负的,来执行这个运算。
整数在计算机中通常是以补码的形式存在的,而-1的补码(用4个字节储存)为1111,1111,1111,1111。对大多数C语言的实现,处理同样字长的有符号数和无符号数之间的相互转换的一般规则是:数值可能会改变,但是位模式不变。
也就是说,将unsigned int强制类型转换成int,或将int转换成unsigned int底层的位表示保持不变。也就是说,即使是-1转换成unsigned int之后,它在内存中的表示还是没有改变,即1111,1111,1111,1111。
同样的储存表示对于应用程序而言可能对应着不同的数据,例如1111,1111,1111,1111对于有符号数而言它表示-1,但对于无符号数而言,它表示UMax(因为没有符号位,就像正数的反码补码都是它本身一样,且最高位也不表示符号位),但是它们的底层存储都是一样的。
以上是关于C语言中,64位无符号整型如何进行开方运算?的主要内容,如果未能解决你的问题,请参考以下文章