精华内容
下载资源
问答
  • 那些年的坑--双精度数值转成整形

    千次阅读 2016-07-07 11:33:00
    解决方法是在转整形之前加上正负0.000001 浮点数二进制表示可参考 阮一峰的浮点数的二进制表示 http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html 转载于:...

            关于语言内置类型的转换,平时写代码都是直接强转,有显式的,有隐式,一般都是不会出现问题。但是,这次确是遇到了一个问题,具体原有还是跟浮点数使用二进制表示法有关,有些数很难直接表示出来,就像代数中的1/3的结果永远表示不完一样。

    上面就上代码(VS2010 win7 32位)

    int  main()
    {
        double f1 = 8.45;
    	double f2 = f1;
    	int i1 = (int)(f2 * 100);
    	printf("%d", i1);
    }

    输出的结果:844

    通过vs的监视器查看

    解决方法是在转整形之前加上正负0.000001

    浮点数二进制表示可参考  阮一峰的浮点数的二进制表示http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html

    转载于:https://my.oschina.net/ikel/blog/707621

    展开全文
  • c语言格式(双精度 单精度)

    千次阅读 2018-07-13 16:03:53
    单精度为f双精度为lf

    单精度为f

    双精度为lf

    展开全文
  • 整型变量赋值给浮点型变量的时候,对于两种不同的存储形式,计算机是怎么完成数据的复制? 首先,编一个简单的C程序,通过编译生成的汇编文件看一下计算机是怎么处理的。 /*文件名:1.c*/ #include <stdio.h>...

    问题: 计算机存储中,整型数据是以补码的形式存储在存储介质中,而浮点型数据是遵循IEEE754标准将数据存储在存储介质中。当整型变量赋值给浮点型变量的时候,对于两种不同的存储形式,计算机是怎么完成数据的复制?

    首先,编一个简单的C程序,通过编译生成的汇编文件看一下计算机是怎么处理的。

    /*文件名:1.c*/
    #include <stdio.h>
    int main(int argc, const char *argv[])
    {
    	int a = 9;
    	float b = 1.0;
    	b = a;
    	return 0;
    }
    

    生成汇编代码:

    gcc -S 1.c -o 1.s
    

    汇编代码:

    	.file	"1.c"
    	.text
    	.globl	main
    	.type	main, @function
    main:
    .LFB0:
    	.cfi_startproc
    	pushl	%ebp
    	.cfi_def_cfa_offset 8
    	.cfi_offset 5, -8
    	movl	%esp, %ebp
    	.cfi_def_cfa_register 5
    	subl	$16, %esp
    	movl	$9, -4(%ebp)   ;初始化a = 9
    	movl	.LC0, %eax
    	movl	%eax, -8(%ebp) ;初始化b = 1.0
    	fildl	-4(%ebp) ;fildl指令用于将整型压入浮点型寄存器FPU的数据寄存器st
    	fstps	-8(%ebp) ;将st寄存器准换为单精度数据保存到b变量中,出栈
    	movl	$0, %eax
    	leave
    	.cfi_restore 5
    	.cfi_def_cfa 4, 4
    	ret
    	.cfi_endproc
    .LFE0:
    	.size	main, .-main
    	.section	.rodata
    	.align 4
    .LC0:
    	.long	1065353216     ;这是十进制,表示浮点数1.0,这里根据CPU的情况,将浮点型常量以长整型8个字节进行存储
    	.ident	"GCC: (GNU) 4.8.5"
    	.section	.note.GNU-stack,"",@progbits
    

    这里需要注意两条指令:
    1、fildl -4(%ebp)
    ;fildl指令用于将整型压入浮点型寄存器FPU,就是将a存储单元内的数据(补码格式)经过硬件转换为浮点型存储格式存储到st数据寄存器中,即从内存中到寄存器中。

    FPU的数据寄存器共有8个,每个都是80个位(10字节),如果是浮点型数据复制到80个位寄存器中,不是简单的从最低位开始,逐一进行对应复制,需要根据符号位、阶数位、尾数位进行对应的转换复制。

    2、fstps -8(%ebp)
    将st数据寄存器中的浮点数保存到b变量中,即从寄存器到内存中,因为st数据寄存器是80位的,一般复制到单精度、双精度会造成数据的数据丢失,导致程序出现奇怪的问题,所以为了稳妥起见,尽量使用变量类型为long double而非float、double型。

    在这里插入图片描述
    参考资料:
    剖析Intel IA32架构下C语言及CPU浮点数机制

    通用寄存器

    顾名思义,通用寄存器是那些你可以根据自己的意愿使用的寄存器,但有些也有特殊作用,IA32处理器包括8个通用寄存器,分为3组。

    1、数据寄存器:

    EAX 累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据。
    EBX 基址寄存器,常用于地址索引

    2、变址寄存器:

    ECX 计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.
    EDX 数据寄存器,常用于数据传递。

    3、指针寄存器:

    EBP为基址指针(Base Pointer)寄存器,存储当前栈帧的底部地址。
    ESP为堆栈指针(Stack Pointer)寄存器,一直记录栈顶位置,不可直接访问,push时ESP减小,pop时增大。

    指令指针寄存器

    EIP 保存了下一条要执行的指令的地址, 每执行完一条指令EIP都会增加当前指令长度的位移,指向下一条指令。用户不可直接修改EIP的值,但jmp、call和ret等指令也会改变EIP的值,jmp将EIP修改为目的指令地址,call修改EIP为被调函数第一条指令地址,ret从栈中取出(pop)返回地址存入EIP。

    寄存器详细参考:
    汇编速查-IA32寄存器组织

    拓展阅读:

    AT&T 与 Intel 的汇编语言语法区别

    AT&T汇编语言初步

    汇编语言学习笔记(十二)-浮点指令

    Linux 汇编语言开发

    linux下汇编语言开发总结

    展开全文
  • 错误实例01:program subroutine real*4 arr arr=1.1 call fun1(arr)endsubroutine fun1(arr) real*8 arr write(*,*) arr end情况下 主程序定义了一个 单精度的...子函数的变量类型是双精度。 打印结果是 [root

    错误实例01:

    program subroutine
          real*4  arr 
          arr=1.1
    
          call fun1(arr)
    
    end
    
    
    
    subroutine fun1(arr)
    
        real*8 arr 
    
        write(*,*)  arr 
    
    end

    情况下
    主程序定义了一个 单精度的变量 arr ,赋值为1.1,
    子函数的变量类型是双精度。
    打印结果是
    [root@localhost subroutine]# ./a.out
    -1.39490411823145607E+195
    [root@localhost subroutine]#

    说明 尝试用 双精度的方式 去解释单精度时候, 会出现严重的错误。

    经过测试 ,反过来, 用单精度的方式去解释 双精度时 ,也会发生这样的错误 。

    结论。只有 两边的精度匹配时,才能得到预期的效果。
    要么都是双精度。
    要么都是单精度。

    情况2
    如果用 数字的情况下, 要用什么类型来 处理呢?
    经测试, 如果是 1.1 这样的字面值, 就是单精度, 用 real*4 就可以。 real*8 就不行。
    如果需要双精度 的字面值,要写成 1.1d0 ,这样用real*8 就可以。

    参考http://www-classes.usc.edu/engr/ce/108/text/fbk01.htm

    情况3
    如果,就要需要一个单精度的数字,而输入偏偏是双精度 ,那怎么办呢?

    program subroutine
    
          call fun1(1.1d0)
    
    end
    
    
    
    subroutine fun1(tmp)
        real*8 tmp 
        real*4 arr 
        write(*,*)  tmp 
        arr=tmp
    
        write(*,*)  arr 
    
    end

    应该像这个例子,先用相同的精度,把数字接过来, 再进行赋值。

    例子3

    program test
        real,external:: add  // 应该显示声明为 real*8
        real*8 arr 
        arr = add(1.1)
    
        write(*,*) arr 
    
    
    end
    
    real*8 function add(t)
        real t
    
        add=1.1
    
        return 
    end

    例子3 的输出也是错的。因为函数返回类型是 real*8,
    但是在 主程序中, 声明的时候,是real, 并没有标明是real*8 ,在我的机器上,
    real 和 real*4 的一个意思 ,所以也会出错。

    展开全文
  • (c语言)单、双精度

    千次阅读 2020-03-25 21:20:28
    双精度型 1.用符号double表示 2.分配8个字符 3.数值范围1.7E-308~1.7+308,可提供16个有效数字 4.后缀为lf或LF表示双精度浮点型(若无后缀则默认为double) 单双精度浮点型之间的赋值 1.将float类型的变量赋...
  • 最近在用 sscanf 读取一个浮点数,显示总是出错,后来发现是 double 和float 赋值的问题,现把过程粘出来,便与以后记忆; 代码如下: //testchar tempppp[50] = {0};strcpy(tempppp, "npt=11.0-34.23");double a,b;...
  • import java.io.*; public class SimpleOutputTest{ public static void main(String args[]){ double Pi = 3.1415; int i = 10; boolean okay = true; char cc = 'J'; String s = ...
  • //文件名:Area.java public class Area { public static void main(String[] args) { double pi,r,a; r=10.8;//radius of circle pi=3.1416;//pi,approximately a=pi*r*r;//compute area ...
  • 1) 将浮点型数据(包括单、双精度)赋给整型变量时,舍弃其小数部分。 2) 将整型数据赋浮点型变量时,数值不变,但以指数形式存储到变量中。 3) 将一个double型数据赋float变量时,要注意数值范围不能溢出。 4)...
  • 在Java中,通常我们想要使用一个数据时,需要先将其赋值给一个变量,然后对这个变量进行操作(没有为什么,这是规则)。 变量赋值三要素:数据类型,变量名,值。 例: int age=18; 其中int表示整型,告诉我们age...
  • 整数相除double赋值问题

    千次阅读 2017-11-14 09:05:55
    double x =(x1-x2)/(y1-y2) 如果y1-y2特别大的话会出现x=0的情况,不知道代码中运算顺序是怎样的 需要分开算 double t=x1-x2 double t/(y1-y2)
  • 最基本的语句——赋值语句

    万次阅读 多人点赞 2019-06-27 14:46:47
    最基本的语句——赋值语句 【知识点】 赋值运算符;...赋值符号=就是赋值运算符,它的作用是将一个数据赋一个变量。执行过程称为:赋值操作或赋值运算。 将一个常量赋一个变量 例如:int a = 23;...
  • 赋值运算符: 赋值运算符 优先级 运算符 功能 结合方式 14 = += -= *= /= &= ^= |= >= 各种赋值 由右向左 赋值表达式: 如:int a; a = 3; 赋值运算符的作用是:使= 如a=3;这条语句中:a是左值,=是...
  • c语言 赋值过程中的类型转换

    千次阅读 2018-06-24 10:56:05
    如果赋值运算符两侧的类型一样,则直接进行赋值,当赋值运算符两侧的类型不一样时,在赋值时要进行类型转换,转换是由系统自动进行进行的,规则如下:(一)把浮点型数据赋值给整型变量时,要先进行取整操作(去掉...
  • 赋值表达式和赋值语句

    千次阅读 2020-09-12 18:23:44
    赋值表达式也就是有“=”的式子,赋值表达式的左边是一个可修改的值,...(2):整型数据双精度时,数值不变,后面加小数点即可。例如 a=3,转换之后为a=3.0 (3):double类型float类型时,双精度转换成单精度,只
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    JDK Java Development Kit是提供Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等 JVM&JRE&JDK...
  • 定义代码如下 ...以上这段代码,虽然不会报错,但是计算结果精度有问题。   现象: c得到的是一个溢出的结果。 ------------------------------------ 原因: 先把 a + b 为 int,这时已经溢出了
  • 赋值表达式

    千次阅读 多人点赞 2018-02-11 11:26:00
    算术表达式 知识点:运算符号的优先级别;强制类型转换的使用;...2、求余运算符%的运算对象只能是整型,即%左侧的被除数与右侧的除数都只能为整型值。 求余得到的运算结果的符号与被除数相同。(3%1....
  • 赋值操作是程序设计中最常用的操作之一,C 语言共提供了 11 个赋值运算符,均为二元运算符,其中仅有一个为基本赋值运算符 =,其余 10 个均是复合赋值运算符,即: (1)简单赋值运算符" = " 用法:变量标识符 = ...
  • 如果赋值运算符两侧的类型不一致,但都是算术类型的,在赋值时要进行类型转换。 类型转换是由系统自动进行的,转换规则如下: (1)将浮点型数据赋给整型变量时,先对浮点数取整,也即舍弃小数部分,然后赋予整型变量...
  • 不管是基本的char字符型,还是包装字符类型Character,它们的每个变量只能存放一个字符,无法满足对一串...例如字符串变量赋初始值,就有多达四种的赋值形式(包装类型只有三种赋值),分别介绍如下:1、被引号...
  • 赋值变量的默认值

    千次阅读 2019-09-27 19:33:51
    2019年9月25日 ​ 在java思考题中遇到这么一道题: ...双精度浮点型double默认值为0.0d; 字符型char默认值为"/u0000"; 布尔性boolean默认值为false; 引用类型变量默认值为null ;
  • double,双精度,很精确的意思。 double money; // 定义浮点型变量,用于存放浮点数。 (二)字符串变量 在C语言中,没有“字符串”这个数据类型,而是用字符数组来存放字符串,并提供了丰富的库函数来操作字符串。 ...
  • 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6.布尔型数据:bool 7.对象类型:object 8.二进制:binary 语言类型: 1.强类型...
  • 赋值运算符 赋值符号“=”就是赋值运算符,它的作用是将一个数据赋一个变量。如“a=3”的作用是执行一次赋值操作(或称...1) 将浮点型数据(包括单、双精度)赋给整型变量时,舍弃其小数部分。 2) 将整型数据赋
  • 赋值与类型转换

    2019-07-11 07:45:57
    在编写程序的过程中常需要对一些变量预先设置初值,C语言允许在定义变量的同时变量赋初值 有以下几种述职方式 int x=5; 定义x为有符号的基本整型变量,赋初值为5 int x,y,z=6; 定义x,y,z为无符号基本整型变量,z...
  • 浮点型:float double 1、float 4个字节 double 8个字节 2、float是单精度 double是双精度,double更精确。 比如说,10/3,如果用float来存储的话可能是:3.3333,如果用double来存储的话,可能是3.33333333 但...
  • C语言

    万次阅读 多人点赞 2019-12-18 23:01:50
    单精度浮点数有效数字保证6位,部分7位,双精度浮点数有效数字保证15位,部分16位。 22.sizeof可以看成是一个无符号整型表达式(sizeof为字节运算符) 23.强制运算符:(类型名)(表达式) 逗号运算符:, 条件...
  • 小甲鱼零基础入门学习python笔记

    万次阅读 多人点赞 2019-08-14 11:06:30
    003 小插曲之变量和字符串 插曲之变量 •变量名就像我们现实社会的名字,把一个值赋值给一个名字时,Ta会存储在内存中,称之为变量(variable),在大多数语言中,都把这种行为称为“变量赋值”或“把值存储在...
  • public class TypeExchange { public static void main(String[] args) { // 定义一个整型变量n,值为98 //定义一个char类型的变量ch,将变量n赋值给ch,然后输出ch的值 //定义一个长整型变量var,值为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,286
精华内容 12,514
关键字:

双精度赋值给整型