SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 552|回复: 3
打印 上一主题 下一主题

请教各位高手!数值3200011003070000002为何显示不对?详细程序如下

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-5-18 09:12:17 | 只看该作者

请教各位高手!数值3200011003070000002为何显示不对?详细程序如下

data b;
ATTRIB
a LABEL="金额" informat=best19. format=best19.;
a=3200011003070000002;
put a ;

run;

对于a的值,输出是3200011003070000128
不知是什么原因?
请教各位高手!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-5-18 16:20:31 | 只看该作者

Re: 请教各位高手!数值3200011003070000002为何显示不对?详细程序如下

sas在处理数值的时候是以浮点型数值去处理的,用的是双精度的浮点型,学过c的话应该知道,用的标准是IEEE754-2008.
算法:value=(sign)*(2**exponent-1023*(1+b**1/2**1+b**2/2**2...)
如3=(1)*(2**(1024-1023)*(1+1**1/2**1))=2*(1.5)=3
你可以用下面的code去生成这一长串的二项式,然后计算一下就知道为什么是那个值了。

data a;
keep n sign exponent mantissa;
length bits $ 64 sign $ 1 mantissa $ 52;
input n @@;
bits = put(n,binary64.);
sign = substr(bits,1,1);
exponent=input(substr(bits,2,11),binary12.)-1023;
mantissa = substr(bits,13,52);
format n best19.;
cards;
3200011003070000002
;
run;
所以存这么长的数值,又要保证完全正确,不如用字符,当然空间会浪费点。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-5-18 16:46:43 | 只看该作者

Re: 请教各位高手!数值3200011003070000002为何显示不对?详细程序如下

很强大
多谢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-5-18 21:51:01 | 只看该作者

Re: 请教各位高手!数值3200011003070000002为何显示不对?详细程序如下

9,007,199,254,740,992是windows和unix系统能储存的最大整数值. os390能存的最大值是72,057,594,037,927,936.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 09:03 , Processed in 0.067356 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表