C语言编写输出double的最大值
发布网友
发布时间:2022-04-28 20:14
我来回答
共5个回答
热心网友
时间:2022-06-23 01:33
首先你知道double是8个字节,然后你得知道double的内存存储结构
低52位是底数,这里全用1填充
再11位是指数,11位指数可表示-1024~1023,规定统统加上1023,所以指数这里填充2046的bit位
最高位是符号为,为0表示+
测试代码如下:
#include <stdio.h> //for printf
#include <string.h>//for memcpy
#define MAX_BASE (0xfffffffffffffLL) //52 bits base
#define MAX_POW (2046LL << 52)//12 bit pow(base * 2^pow)
#define SIGN_BIT (0x1LL << 63)
void printBits(long long ll)
{
long long mask = 1;
for(int i=sizeof(long long) * 8 - 1; i>=0; i--)
{
printf("%1d", (ll & mask << i)? 1: 0);
}
printf("\n");
}
int main()
{
long long ll = 0;
ll |= MAX_POW;
ll |= MAX_BASE;
printBits(ll);
double d;
memcpy(&d, &ll, sizeof(ll));
printf("Max double is: %e\n", d);
ll |= SIGN_BIT;
memcpy(&d, &ll, sizeof(ll));
printf("Min double is: %e\n", d);
return 0;
}
热心网友
时间:2022-06-23 01:33
0. “不要用头文件什么的,仅仅使用C来编写”说得好像头文件不是C语言的东西似的……
整形变量的话比较简单,用位运算可以解决,例如
unsigned long maxuint=~0ul;
但是浮点数不是位运算那么简单。具体参考IEEE的浮点类型标准:
https://en.wikipedia.org/wiki/IEEE_floating_point
但事实上C语言标准建议使用头文件<limits.h>和<float.h>中定义的各个类型的最大值最小值,如ULONG_MAX和DBL_MAX等。由于数据类型在不同平台上的实现不同,位运算等获取最大值的方法不能保证跨平台的安全性
热心网友
时间:2022-06-23 01:34
无论什么类型,最大值都是 01111111... 最小值都是111111... 吧,好像是,懒得想了
for(int i = 0, int sum = 0; i < sizeof(type) * 8; i++)
{
sum |= 1;
sum = sum<<1;
}
type ans = (type)sum;
大概思路就是这样吧,for循环的上限要不要-1 还有最大值最小值的区别自己考虑下吧。。不想想了。。
热心网友
时间:2022-06-23 01:34
前面的不知道不瞎说好吧,float的浮点类型表示方法完全不一样,首先你需要知道float存在规格数和非规格数,所以不能是首位为0后面全为1,这个叫NaN是个特殊值,实际上的最大值为首位为0指数位为11111110再加上尾数23个1,才对,实际上float类型的复杂度比你想得多,因为为了补码和原码的兼容计算还有对于存储值的平滑性,IEEE设计的非常好。
如果你对于float感兴趣可以好好学一下
热心网友
时间:2022-06-23 01:35
#include <stdio.h>
#include <limits.h>
void int_max() {
printf("%d\n",INT_MAX);
}
其它自己搜索去
追问不要用头文件该怎么写呢