Fortran Coder

标题: Fortran 读取SEGY文件 提示(95)浮点数转换失败 [打印本页]

作者: kuangshenzk    时间: 2021-6-16 15:19
标题: Fortran 读取SEGY文件 提示(95)浮点数转换失败
本帖最后由 kuangshenzk 于 2021-6-16 15:53 编辑

读取IBM格式的SEGY数据时,  浮点数 提示转换失败,  使用的是Open语句中 convert ibm,1、这个有什么解决方案,修改这个错误   2、经验证,转换失败处的浮点数应该为0,属于无效值,但是因为存在这个问题所以读取整个数据时间花费太多,有没有什么方案可以提速
作者: kuangshenzk    时间: 2021-6-16 15:30
program main
    !use IFWin
    !
    !aa=call CreateFile("cc.dat",0,0,0,0,0,0)
    integer:: aa
    integer(kind=1):: a(3600)
    integer(kind=1):: b(240)
    !character(len=5):: aa
    real::            m(16)
    !aa="11"//"bb"
    open(100,file="BCO3_3D.sgy",form="unformatted",access="stream",convert="ibm")   
    read(100)a
    !do i=1,1000,1
    !read(100)b
    !read(100,IOSTAT = aa)m
    !end do
        read(100)b
    read(100)m
   

    end program main
作者: kuangshenzk    时间: 2021-6-16 15:32
提示的错误:
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed
forrtl: info (95): floating point conversion failed

作者: fcode    时间: 2021-6-16 17:47
应该是你的sgy里有道头或卷头。你直接读了地震记录,编译器错误的把道头或卷头里的其他数据类型,当作IBM浮点数转换成IEEE浮点,造成出错。
作者: kuangshenzk    时间: 2021-6-17 10:47
fcode 发表于 2021-6-16 17:47
应该是你的sgy里有道头或卷头。你直接读了地震记录,编译器错误的把道头或卷头里的其他数据类型,当作IBM浮 ...

read(100)m报出的错误  读这个的时候 我把卷头和道头信息都读出去了
作者: fcode    时间: 2021-6-17 14:34
把sgy文件传上来(附件,如果太大就百度网盘分享地址)
作者: kuangshenzk    时间: 2021-6-18 16:09
您好  我截取了一道数据    数据包含  3600byte 的卷头  240byte 道头  和 道采样500个数据点

Test.rar

1.55 KB, 下载次数: 2


作者: fcode    时间: 2021-6-20 23:03
你的这个文件是 IBM 浮点数大端的数据。
你的编译器没有提供直接的方法读取。convert 只有 'BIG_ENDIAN' , 'IBM' 而没有 IBM_Big_Endian

你可以当作 IEEE浮点数大端,先读进来,然后找一个IBM浮点转IEEE浮点的子程序再转一下。
  
作者: kuangshenzk    时间: 2021-6-21 16:30
fcode 发表于 2021-6-20 23:03
你的这个文件是 IBM 浮点数大端的数据。
你的编译器没有提供直接的方法读取。convert 只有 'BIG_ENDIAN' , ...

谢谢回复,还有个疑问,我现在想通过位计算算数据,这样的浮点数读按字节读入后 是不是也要调换字节顺序,然后再用ibm公式计算浮点数值?我算了一下 我发现不调换顺序 计算结果好像是正确的,调换后不正确了
作者: fcode    时间: 2021-6-21 17:59
如果你 convert="big_endian" 了,那么编译器会帮你转换字节序。
否则,你需要自己转换字节序




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2