找回密码
 注册
X系列官方授权正版
搜索
楼主: nhofb

[灌水] 哦也,偶发现了0.15一个好玩的地方………………

[复制链接]
发表于 2013-3-27 11:40:09 | 显示全部楼层
tcelvis 发表于 2013-3-27 11:26
你对float和double的理解程度就是float等于十进制的7位有效数字,double等于14位有效数字么……

如果你 ...

看样子你的理解能力有限,居然能从特例上看出普遍规律
不知道你是哪行的,不过真丢人,估计也入行不深
回复

使用道具 举报

发表于 2013-3-27 11:47:36 | 显示全部楼层
chengfan 发表于 2013-3-27 11:40
看样子你的理解能力有限,居然能从特例上看出普遍规律
不知道你是哪行的,不过真丢人,估计也入行不深 ...

  1. #include <stdio.h>


  2. int main(void)
  3. {
  4.     double a = 4.7527289157379;
  5.     float b = a;

  6.     printf("%.20f %.20f\n", a, b);

  7.     return 0;
  8. }
复制代码
4.75272891573790001729 4.75272893905639648438


用的可是您的特例哦。

丢人什么的,呵呵呵。

学艺不精还是不要出来找抽的好。
回复

使用道具 举报

发表于 2013-3-27 11:48:30 | 显示全部楼层
tcelvis 发表于 2013-3-27 11:32
虽然你说的都对,但是显然毫无重点。

整型运算当然可以构建浮点运算。你让我用加法器给你搭一个FPU我都 ...

”可能使用自定义浮点“我写的很清楚:不需要,所谓的”重点“就是”需求决定使用类型“

你只看到了一长串数字,然后迫不及待的秀一下”知识面“,还指责其他人抢了你的风头
谁管你毕设做的什么,真是莫名其妙

不要总以为所有人都要和你作对一样,不管你会不会弄什么数电,你这种敌对的态度只会说明你不会做人
典型的没事找抽型的二百五回复
回复

使用道具 举报

发表于 2013-3-27 11:51:51 | 显示全部楼层
chengfan 发表于 2013-3-27 11:48
”可能使用自定义浮点“我写的很清楚:不需要,所谓的”重点“就是”需求决定使用类型“

你只看到了一长 ...

哇哇哇,开始人参公鸡了耶。

我也没必要说啥了。

如果double是:4.7527289157379,则转为float后只有4.752729

这句话已经充分说明你的水平了。
回复

使用道具 举报

发表于 2013-3-27 11:53:20 | 显示全部楼层
tcelvis 发表于 2013-3-27 11:47
用的可是您的特例哦。

丢人什么的,呵呵呵。

你这丢人丢大了

printf里通配符%f会将double\float统一转成double型输出,转成double后,精度自然提高

不要以为弄个编译环境,写几个helloworld就算懂计算机了
这部分知识你上学的时候都学了,记不住、不会用可怪不得别人
回复

使用道具 举报

发表于 2013-3-27 11:57:08 | 显示全部楼层
本帖最后由 tcelvis 于 2013-3-27 12:00 编辑
chengfan 发表于 2013-3-27 11:53
你这丢人丢大了

printf里通配符%f会将double\float统一转成double型输出,转成double后,精度自然提高


lol

既然你知道float也会被转为double输出。

那么请问,你的float是怎么输出就得到4.752729了呢?

另外这句话也充满槽点了呢:
转成double后,精度自然提高

虽然我觉得再这么伤你自尊下去我都要不忍心了。
回复

使用道具 举报

发表于 2013-3-27 12:15:42 | 显示全部楼层
tcelvis 发表于 2013-3-27 11:57
lol

既然你知道float也会被转为double输出。

你真不会假不会啊

按照IEEE754浮点标准保存,float转成double后,指数域和小数域保持一致,只是从32位变成了64位,只不变。

但printf里输出数字时,需要把(-1)^s * M * 2^E格式的数字重新计算形成10进制的数字。
此步骤是按照double型计算,精度当然会”变高“

因此才会有:

double v0 = 4.71135467879891879874156;
float v1 = (float) v0;
double v2 = v1;

print v1: 4.7113547
print v2: 4.711354732513428
print (v1==v2): true




回复

使用道具 举报

发表于 2013-3-27 12:28:10 | 显示全部楼层
本帖最后由 tcelvis 于 2013-3-27 12:35 编辑
chengfan 发表于 2013-3-27 12:15
你真不会假不会啊

按照IEEE754浮点标准保存,float转成double后,指数域和小数域保持一致,只是从32位变 ...

啊哈哈哈哈
不要以为弄个编译环境,写几个helloworld就算懂计算机了

这段话又可以还给你了。

虽然这么点代码看不出来你用的是什么脚本语言。不过很显然你所依赖的print按照float/double类型默认了展开精度。跟float本身的精度一毛钱关系都没有。

很可惜,你自己的例子正好证明了你的根本性错误。
  1. print (v1==v2): true
复制代码
正好证明了从float到double的转换不会改变实际数值。因此printf的%f格式输出化是以double还是float展开根本就无关紧要,因为float转换为double后double中保存的依然是与float数据完全相同的信息。

依赖这个搞笑的print语句本身的预设来证明float的十进制展开形式就应该比double短恰恰证明了你对浮点数的二进制本质完全没有理解。

这部分知识你上学的时候都学了,记不住、不会用可怪不得别人

这句话也还给你喽。
回复

使用道具 举报

发表于 2013-3-27 12:58:47 | 显示全部楼层
tcelvis 发表于 2013-3-27 12:28
啊哈哈哈哈

这段话又可以还给你了。

拜托,你连代码都看不懂啊

1、你连代码都看不懂
       v0是原始double值,v1是v0转成float的float值,v2是v1转成double的double值
       弄出v1==v2只是让你知道printf在输出浮点时展示的是运算结果,而不是值本身
       用来证明你之前通过printf来展示float的小数精度的方法是错的

2、不同语言、编译环境、执行环境展示结果是不同的
       输出长短,我这里的环境按照%f输出float就是短的。
       这只能证明你接触的范围比较窄。

从开始的满嘴呼吹,到后来的基础能力低下。
小伙子,就这水平,当心丢饭碗。
回复

使用道具 举报

发表于 2013-3-27 13:27:18 | 显示全部楼层
本帖最后由 tcelvis 于 2013-3-27 15:15 编辑
chengfan 发表于 2013-3-27 12:58
拜托,你连代码都看不懂啊

1、你连代码都看不懂


lol,发现自己的错误开始胡搅蛮缠了么。

就两个问题

1、IEEE754中float转成double会不会改变实际数值

2、凭什么你可以看出KSP的文本中的数值就是从double展开出来的

第一个问题你要有脸答“会”,我一句话不说甘拜下风。

第二个问题,呵呵,你想用你用的特定环境中print的展开方式来证明KSP的浮点也一定是这么展开的么?这跟我的眼界可没关系。


说实在的,本人虽然嘴毒,但还不至于碰谁都战。只不过像你这样上来一句“如果double是:4.7527289157379,则转为float后只有4.752729”完了还一副业内前辈嘴脸想教育人的实在是自取其辱。
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|DeepTimes.NET 太空游戏站