有0没0有0女0人0玩0文0字000000000000000

用户对问题“为什么在Python3中浮点值4*0.1看起来不错,而3*0.1却不好看呢?”的回答 - 问答 - 云+社区 - 腾讯云云+社区首页知道大多数小数没有精确的浮点表示是这样的:&&& 3*0.1
&&& from decimal import Decimal
&&& Decimal(3*0.1)
Decimal('0.8125')
&&& Decimal(4*0.1)
Decimal('0.40625')写回答邀请回答为什么在Python3中浮点值4*0.1看起来不错,而3*0.1却不好看呢?写回答可以很容易地验证这一点:&&& 3*0.1 == 0.3
&&& 4*0.1 == 0.4
True在上面使用十六进制表示法,很紧凑,并且显示了这两个值之间的差异。可以自己用。(3*0.1).hex()如果你想看到他们在十进制的方式,你可以这样做:&&& Decimal(3*0.1)
Decimal('0.8125')
&&& Decimal(0.3)
Decimal('0.796875')
&&& Decimal(4*0.1)
Decimal('0.40625')
&&& Decimal(0.4)
Decimal('0.40625')热门问答用户画像的标签有以下几个维度:
1、自然特征/基本属性
如性别、年龄、体形、地域、职业、教育程度等
2、消费特征/购买能力:如婚否、收入、车、房、孩子、购物类型、品牌偏好、信用水平、购买周期等
3、社会特征/行为特征:如婚姻状况、家庭构成、社交偏好、信息渠道等
4、兴趣特征/心理...... 如果想将腾讯云提供的Demo换成自己的服务器,可以做以下步骤。
1. 搭建 &webrtc-room& 的服务器
1.1 这个服务器能做什么?
点击demo里的互动课堂 &webrtc-room& 功能,您会看到一个房间列表,这个房间列表是怎么实现的呢?
在看到视频房间列表以后,...... 虚拟化技术是指计算元件在虚拟的基础上而不是真实的基础上运行,它可以扩大硬件的容量,简化软件的重新配置过程,减少软件虚拟机相关开销和支持更广泛的操作系统方面。通过虚拟化技术可实现软件应用与底层硬件相隔离,它包括将单个资源划分成多个虚拟资源的裂分模式,也包括将多个资源整合成一个虚拟资...... 可以安装PyFilter软件,它的目的是过滤掉服务器的所有非法登录请求。它的工作原理是读取防火墙日志文件,并在用户可配置的时间内检查请求是否来自同一IP地址。如果它捕获了太多失败的尝试,则会向防火墙添加规则,从而拒绝其连接到服务器。
下载和配置PyFilter
从Github克...... 1、对称加密算法
所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。
常用的算法有:DES、3DES、AES等。
全称为Data Encryption Standard,即...... 微软 CEO Nadella 其实在之前谈到了微软在过去几年中如何成为 GitHub 上最活跃的组织,提交了超过 200 万次的项目 commits 和 updates ,并表示微软正在全身心地投入开源。
但是这样也并不能让开发者重拾对微软的信心
因为 从始至终,微软对开源的嫉...... 扫描二维码扫描关注云+社区0000000dfg0-运动健身视频-搜狐视频
0000000dfg0
推荐出品人新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
家境小康, 积分 1794, 距离下一级还需 206 积分
论坛徽章:0
系统在启动时,遇到一些错误。
CPU 0 Unable to handle kernel paging request at virtual address 00a0
, epc == cd6c0, ra == c0f4
$ 0& &: 00 0001
$ 4& &: ffff 09f507ac0 ffffffffbfd00000
$ 8& &: ffffffffbfe
$12& &: c4e0 001f
$16& &: 00000ffff
$20& &: 09f507ac0 7ca0 0000
$24& &: 09e4df6b4
$28& &: 09f4 c0f4
Hi& & : 0000
Lo& & : 0780
epc& &: cd6c0 $L95+0x20/0x1a8 [pcan]& &&&Not tainted
ra& & : c0f4 $L130+0x0/0x40 [pcan]
Status: & & KX SX UX KERNEL EXL IE
BadVA : 00a0
Modules linked in: pcan
Process klogd (pid: 2138, threadinfo=4000, task=1f3
Stack : 00000ffff c0f4 0000
& && &&&df00 ac0
& && &&& ffffffff ffffffff
& && &&&ffffffff807ec780 09fcc09f507ac0
& && &&&fffffffffffbffff 000a ffffffff802787ac 07b1
& && &&&7ac0 04
& && &&&0001 ffffffff802017bc 7fffffffffffffff 0034
& && &&&fbf63a0 df680 bf00 fbf6120
& && &&&ffffffff80202d00 ffffffff806ae6d4 0000 ffffffffcfffffff
& && &&&0000009fbf6428 7fffffffffffffff
& && &&&...
Call Trace:
[&cd6c0&] $L95+0x20/0x1a8 [pcan]
[&c0f4&] $L130+0x0/0x40 [pcan]
Code: dca5f8&&0165102d &dccc62010c&&02
Kernel panic - not syncing: Fatal exception in interrupt
这个是在安装我们自己设计FPGA驱动的时候出现的。
这个错误在我们这出现的次数不多,重复开关机,半天会出现一次。但是在客户那里经常出现。
请问一般是什么原因造成的这种错误?
在此先谢谢各位的帮助了
论坛徽章:6
从panic的信息可以找到出错的那行代码,把那行出处的代码贴出来看看
家境小康, 积分 1794, 距离下一级还需 206 积分
论坛徽章:0
1、Kernel panic - not syncing: Fatal exception in interrupt
从这句话好像也找不到什么出错信息吧,而且现在还无法定位具体是在哪行代码出现的错误,里面调用的东西太多了。
2、&&从“CPU 0 Unable to handle kernel paging request at virtual address 00a0”这句话来看,是不是一般是内存有问题?或者是非法操作地址造成的?
3、epc& &: cd6c0 $L95+0x20/0x1a8 [pcan]& &&&Not tainted
在这句话中,$L95是不是代表某个模块?怎么知道具体是哪个模块?怎么才能让它找到自己的符号表?解析的时候把函数名也显示出来?因为我在其它的错误里发现这个位置会是出错时函数名,但是这里只是显示了$L95。那么模块函数名称后面的+0x20/0x1a8 又代表什么意思?
论坛徽章:22
这个错误的原因是访问了不对的指针,LZ可以用objdump -S vmlinux 然后用你的PC值看附近的汇编。乃至去看C源码
家境小康, 积分 1794, 距离下一级还需 206 积分
论坛徽章:0
& & 咱们的论坛里有没有哪个帖子是讲如何反汇编程序,并根据反汇编代码调试程序的?如果有的话请发一个地址吧,我想好好学学反汇编调试方法。现在发现汇编也是好东西啊
家境小康, 积分 1794, 距离下一级还需 206 积分
论坛徽章:0
& & mips汇编的objdump 教程……
论坛徽章:6
下面是我自己存档的一段定位oops代码的资料,希望对你有帮助
定位oops的具体代码行
来自Linus Torvalds的讨论:
... 41/ed9c0a0cfcd31111
例如这样的一个Oops:
Oops: 0000 [#1] PREEMPT SMP
Modules linked in: capidrv kernelcapi isdn slhc ipv6 loop dm_multipath snd_ens1371 gameport snd_rawmidi snd_ac97_codec ac97_bus s nd_seq_dummy snd_seq_oss snd_seq_midi_event snd_seq snd_seq_device snd_pcm_oss snd_mixer_oss snd_pcm snd_timer snd parport_pc floppy parport pcnet32 soundcore mii pcspkr snd_page_alloc ac i2c_piix4 i2c_core button power_supply sr_mod sg cdrom ata_piix libata dm_snapshot dm_zero dm_mirror dm_mod BusLogic sd_mod scsi_mod ext3 jbd mbcache uhci_hcd ohci_hcd ehci_hcd
Pid: 1726, comm: kstopmachine Not tainted (2.6.24-rc3-module #2)
EIP: 0060:[] EFLAGS:
EIP is at list_del+0xa/0x61
EAX: e0c3cc04 EBX:
ECX: 0000000e EDX: dec62000
ESI: df6e8f08 EDI: 000006bf EBP: dec62fb4 ESP: dec62fa4
DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
Process kstopmachine (pid: 1726, ti=dec62000 task=df8d2d40 task.ti=dec62000)
Stack: 000006bf dec62fb4 c00020 dec62fbc c044ab4c dec62fd0 c045336c
df6e8f08 c00000 dec62fe0 c043deb0 c043de75 00000
c0405cdf df6e8eb4 00 00000
Call Trace:
[] show_trace_log_lvl+0x1a/0x2f
[] show_stack_log_lvl+0x9b/0xa3
[] show_registers+0xa3/0x1df
[] die+0x11f/0x200
[] do_page_fault+0x533/0x61a
[] error_code+0x72/0x78
[] __unlink_module+0xb/0xf
[] do_stop+0xb8/0x108
[] kthread+0x3b/0x63
[] kernel_thread_helper+0x7/0x10
=======================
Code: 6b c0 e8 2e 7e f6 ff e8 d1 16 f2 ff b8 01 00 00 00 e8 aa 1c f4 ff 89 d8 83 c4 10 5b 5d c3 90 90 90 55 89 e5 53 83 ec 0c 8b 48 04 11 39 c2 74 18 89 54 24 08 89 44 24 04 c7 04 24 be 32 6b c0
EIP: [] list_del+0xa/0x61 SS:ESP 0068:dec62fa4
note: kstopmachine[1726] exited with preempt_count 1
1, 有自己编译的vmlinux: 使用gdb
编译时打开complie with debug info选项。
注意这行:
EIP is at list_del+0xa/0x61
这告诉我们,list_del函数有0x61这么大,而Oops发生在0xa处。 那么我们先看一下list_del从哪里开始:
# grep list_del /boot/System.map-2.6.24-rc3-module
c10e5234 T plist_del
c10e53cc T list_del
c120feb6 T klist_del
c12d6d34 r __ksymtab_list_del
c12dadfc r __ksymtab_klist_del
c12e1abd r __kstrtab_list_del
c12e9d03 r __kstrtab_klist_del
于是我们知道,发生Oops时的EIP值是:
c10e53cc + 0xa == c10e53d6
然后用gdb查看:
# gdb /home/arc/build/linux-2.6/vmlinux
(gdb) b *0xc10e53d6
Breakpoint 1 at 0xc10e53d6: file /usr/src/linux-2.6.24-rc3/lib/list_debug.c, line 64.
看,gdb直接就告诉你在哪个文件、哪一行了。
gdb中还可以这样:
# gdb Sources/linux-2.6.24/vmlinux
(gdb) l *do_fork+0x1f
0xc102b7ac is in do_fork (kernel/fork.c:1385).
1381 static int fork_traceflag(unsigned clone_flags)
1383 if (clone_flags & CLONE_UNTRACED)
1384 return 0;
1385 else if (clone_flags & CLONE_VFORK) {
1386 if (current-&ptrace & PT_TRACE_VFORK)
1387 return PTRACE_EVENT_VFORK;
1388 } else if ((clone_flags & CSIGNAL) != SIGCHLD) {
1389 if (current-&ptrace & PT_TRACE_CLONE)
也可以直接知道line number。
(gdb) l *(0xffffffff8023eaf0 + 0xff) /* 出错函数的地址加上偏移 */
2, 没有自己编译的vmlinux: TIPS
如果在lkml或bugzilla上看到一个Oops,而自己不能重现,那就只能反汇编以&Code:&开始的行。 这样可以尝试定位到
源代码中。
注意,Oops中的Code:行,会把导致Oops的第一条指令,也就是EIP的值的第一个字节, 用尖括号括起来。 但是,有些
体系结构(例如常见的x86)指令是不等长的(不一样的指令可能有不一样的长度),所以要不断的尝试(trial-and-error)。
Linus通常使用一个小程序,类似这样:
const char array[] = &\xnn\xnn\xnn...&;
int main(int argc, char *argv[])
printf(&%p\n&, array);
*(int *)0 = 0;
e.g. /*{{{*/ /* 注意, array一共有从array[0]到array[64]这65个元素, 其中出错的那个操作码 == arry[43] */
const char array[] =&\x6b\xc0\xe8\x2e\x7e\xf6\xff\xe8\xd1\x16\xf2\xff\xb8\x01\x00\x00\x00\xe8\xaa\x1c\xf4\xff\x89\xd8\x83\xc4\x10\x5b\x5d\xc3\x90\x90\x90\x55\x89\xe5\x53\x83\xec\x0c\x8b\x48\x04\x8b\x11\x39\xc2\x74\x18\x89\x54\x24\x08\x89\x44\x24\x04\xc7\x04\x24\xbe\x32\x6b\xc0&;
int main(int argc, char *argv[])
printf(&%p\n&, array);
*(int *)0 = 0;
用gcc -g编译,在gdb里运行它:
[arc@dhcp-cbjs05-218-251 ~]$ gdb hello
GNU gdb Fedora (6.8-1.fc9)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type &show copying&
and &show warranty& for details.
This GDB was configured as &x86_64-redhat-linux-gnu&...
(no debugging symbols found)
Starting program: /home/arc/hello
Program received signal SIGSEGV, Segmentation fault.
注意,这时候就可以反汇编0x80484e0这个地址:
(gdb) disassemble 0x80484e0
Dump of assembler code for function array:
0x : imul $0xffffffe8,%eax,%eax
0x : jle,pn 0x80484dc
0x : ljmp *
0x : rcll (%esi)
0x080484ea : repnz (bad)
0x080484ec : mov $0x1,%eax
0x : call 0x7f8a1a0
0x : mov %ebx,%eax
0x : add $0x10,%esp
0x080484fb : pop %ebx
0x080484fc : pop %ebp
0x080484fd : ret
0x080484fe : nop
0x080484ff : nop
0x : push %ebp
0x : mov %esp,%ebp
0x : push %ebx
0x : sub $0xc,%esp
0x : mov 0x4(%eax),%ecx
0x0804850b : mov (%ecx),%edx
0x0804850d : cmp %eax,%edx
0x0804850f : je 0x8048529
0x : mov %edx,0x8(%esp)
0x : mov %eax,0x4(%esp)
0x : movl $0xc06b32be,(%esp)
0x : add %ah,0xa70
End of assembler dump.
OK, 现在你知道出错的那条指令是array[43],也就是mov (%ecx),%edx,也就是说,(%ecx)指向了一个错误内存地址。
为了使汇编代码和C代码更好的对应起来, Linux内核的Kbuild子系统提供了这样一个功能: 任何一个C文件都可以单独编译成汇编文件,例如:
make path/to/the/sourcefile.s
例如我想把kernel/sched.c编译成汇编,那么:
make kernel/sched.s V=1
make kernel/sched.lst V=1
编译出*.s文件
有时侯需要对*.s文件进行分析,以确定BUG所在的位置。 对任何一个内核build目录下的*.c文件,都可以
直接编译出*.s文件。
# make drivers/net/e100.s V=1
而对于自己写的module,就需要在Makefile中有一个灵活的target写法:
# cat Makefile
obj-m := usb-skel.o
KDIR := /lib/modules/`uname -r`/build
traget := modules
make -C $(KDIR) M=$(shell pwd) $(target)
rm -f *.o *.ko .*.cmd *.symvers *.mod.c
rm -rf .tmp_versions
# make target=usb-skel.s V=1
这样,kbuild系统才知道你要make的目标不是modules,而是usb-skel.s。
另外, 内核源代码目录的./scripts/decodecode文件是用来解码Oops的:
./scripts/decodecode
家境小康, 积分 1794, 距离下一级还需 206 积分
论坛徽章:0
& & 谢谢,很受用
经过排查发现是自己的驱动中使用了未初始化的变量引起的……
小富即安, 积分 2925, 距离下一级还需 2075 积分
论坛徽章:0
瀚海书香 发表于
回复 3# Blaider
下面是我自己存档的一段定位oops代码的资料,希望对你有帮助
===================================
这贴不错,对内核中的错误定位很有帮助。 MARK!
白手起家, 积分 9, 距离下一级还需 191 积分
论坛徽章:0
帖子很好,很受用!C语言中的printf用%d输出float类型数据出现或以%f输出int型数据的结果为什么是0
*******************************float类型%d输出**************************************
& & & float
如果用printf("%d",a);输出的是0。&
但float型用%d输出是否一定是0呢,答案肯定不都是0;
& & & 为什么 7.5
用%d输出的是0?分析如下:
首先来了解下printf的输出格式,int 和 long int 都是32位的,用%d输出;float 、double都是%f输出,但
float 是32位的,double 是64位的,所以在参数传递的时候C语言统一将 float 类型数值传换为 double
类型再传入 printf 函数。如果是32位整型则输出格式为%lld。
& & & 下面来讲一下
&float a=7.5
printf("%d",a)输出为0的情况:
%d只输出低32位的数据,并将这些32位二进制以十进制数输出,编译器首先将
7.5从float类型转换为double类型,7.5在内存中的存放方式是0x40f00000,转换成double类型在内存中的数据就是这个0x401e,这个内存数据可以很明显看出低32位全是0,而%d则只能截取到低32位,所以这个以%d输出7.5的数值当然是
0了。如大家不相信可以用%lld
输出看看,这个%lld就很读到低64位数据,读出的结果就是0x401e,在屏幕上看到一个很大的十进制数。
如果我一定要输出7.5在内存中的存放方法怎么办呢?
可以用printf("%d",*(int
*)&a);这里做了一下处理,不是直接把a传进来,把a所在地址里的内容处理了一下,不管a是什么类型,只对地址进行操作,利用(int
*)&a,将a所在地址中的内容0x40f00000直接当成 int 类型传给printf,int
的类型数据不会再转成double类型了,所以输出正常,这个只是针对浮点型数据只占低32位,如果输出64位还得用%lld格式控制输出。
如果用printf("%d",(int)a),输出行不行,这个强制类型转换只针对a的数据类型进行转换,7.5转换 int
类型是7,而上面的*(int
*)&a,是对内存中的实际存储数据进行操作,蔽开数据类型这一层面,只将这个数据0x40f00000直接转成int类型输出。而(int)a,要先看a的类型,C语言会根据所要数据类型,对内存存储的数据进行改变,以便可以用int类型正确解析内存数据。
如果用printf("%d",(float)a),输出什么,输出的是0,这个只是将a的float类型还转成float类型,还是自动转成doube类型,传给printf函数。
为什么float非要转成double类型呢,因为printf格式控制浮点型输出只有%f,所以统一按doube类型输出,不像整型有32位的%d或%ld,64位的有%lld,这就将32位整型和64位整型用不同的格式控制分开了,而%f则没有,所以printf输出的浮点数其实是统一遍历了64位内存,如果float传入printf没有进行转换,那么printf输出高32位数据将不可预知,printf输出结果也就不正确了,因此传入printf的浮点数都会被编译器隐含转成double类型。
***********************int类型%f格式输出************************************
& & & 如果定义了int
a=0x40f00000;用printf("%f",a)输出的结果是多少呢?
答案是0,至少我们看的屏幕上显示的是0.000000,实际值可不是0啊,只是我们显示的精度只能有15位小数,而实际的数据可能很小很小,0.0000....000几百个0后会有几个有效数据,我们分析一下。
首先C语言把a传进printf,因为a是整型,所以不会自动转成double型数据,直接将0x40f00000传进printf,而%f寻的是64位内存,也就是把0xf00000这个内存中的数据当成浮点型输出来,那浮点型的数据是多少呢,又是怎么存储的呢?
64位浮点数的存放方式:
& & & 63位
& & 62~52位 &
& & & 1个符号位
&11个阶数 & &
从0xf00000来看
1)符号位是0,表示正
& & 2)阶数是0,表示-1023 + 1023 =
0,用指数表示:1.#*2^-1023,‘#’是代表尾数。
3)尾数就是,0x00
4)浮点二进制表示
&2#1.0000*2^(-1023),-1023次方可想而知有多小。
这就是为什么我们的int型数据用%f输出是0.000000的原因。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。帖子很冷清,卤煮很失落!求安慰
手机签到经验翻倍!快来扫一扫!
求助 蓝屏 0**0000000A 都出现过
2326浏览 / 10回复
先说一下配置 965, GA-870A-UD3, 2*2G 1333 , zotac Gtx275,稍微小点 宽幅王2好像只有350 铭牌上写350 12v+103 5V刚刚升级好都没有什么问题,最近多加了一个无线360手柄,更新了nv的到260.99,发现频繁蓝屏。而且有时因为振动而蓝屏,屏都兰了手柄还在震。电源是否要换,会不会是电源的问题。可能是手柄兼容性导致,其他还有什么问题可否帮忙看看!!
不插360手柄是否蓝屏?
手柄、显卡驱动、内存、电源,一个个排查。
内存。手柄和驱动问题吧
内存的确是技嘉官网上,兼容列表里没有的。
手柄的话,可能有点关系。
显卡驱动,我现在用的是259.32,不知道是不是260驱动的关系。
不行只好 换内存 关震动了
对 楼主 smca 说:=========================换个版本系统试下
常规性错误的话,检查硬件比如内存和硬盘。到安全模式里测试。另外看到你说的装了360手柄是,这个可能就是关键了
按照变量原理分析,可能的原因有手柄本声,驱动,或者显卡驱动,逐个排除。。。
换了500w电源 和新内存(老板不给换别的牌子 只肯换同样的新的给我),问题还是出现0×0000000a.
准备卸下手柄测试一下。
显卡驱动 我从258.96 开始 都试过,估计不是显卡问题。
我用的是罗技mk250无线键鼠套,不知有没有驱动冲突
或和手柄冲突
补充一下 我用的迅雷7什么什么版本的 屏蔽上传的,蓝屏会不会和它有关
找老板 换了 内存。 换成威刚2g 1333的。 序列号不知道,条子上没有写技嘉官网上的那个型号,everset 中显示序列号无。
性能和原来的金士顿差不多
但是测试 了一晚上没有蓝屏。希望就此结束蓝屏。
最后 蓝屏代码 D1 7F A结尾的 多数是和内存有关,大家可以换内存试试
用户名/注册邮箱/注册手机号
其他第三方号登录}

我要回帖

更多关于 什么文什么字 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信