tcl格式化固定精度浮点

tcl格式化固定精度浮点,tcl,Tcl,结果:6.25e-07 有没有办法强迫tcl获得像625e-09这样的结果?我认为format命令中没有任何东西可以直接帮助您。但是,如果您考虑格式代码上的微小变化,那么获得想要的东西(使用字符串操作位)可能会容易得多: 给出如下数字:6.25000e-007 这可以更容易地解析: 提取指数 确定要移动小数点的位置数 移动它并替换指数 恐怕这并不完全是直截了当的,但应该是可行的。Wiki页面可能会给您一些启发。假设您希望将其格式化为最接近的指数,您可以使用proc将其格式化如下: forma

结果:6.25e-07


有没有办法强迫tcl获得像625e-09这样的结果?我认为format命令中没有任何东西可以直接帮助您。但是,如果您考虑格式代码上的微小变化,那么获得想要的东西(使用字符串操作位)可能会容易得多:

给出如下数字:
6.25000e-007

这可以更容易地解析:

  • 提取指数
  • 确定要移动小数点的位置数
  • 移动它并替换指数

恐怕这并不完全是直截了当的,但应该是可行的。Wiki页面可能会给您一些启发。

假设您希望将其格式化为最接近的指数,您可以使用
proc
将其格式化如下:

format %#3.6g $number
proc fix\u sci{n}{
#不是指数为负的sci fmt编号
如果{![字符串匹配“*e-*”$n]}{返回$n}
#指数集
设定一个9
b组12
#抓取数字(我称之为“front”)和指数(称为“exp”)
regexp--{(-?[0-9.]+)e-0*([0-9]+)}$n-front exp
#检查哪一组指数更接近数字的指数
如果{[expr{abs($exp-$a)}]<[expr{abs($exp-$b)}]}{
#如果是第一个,获取差异并调整“前”
set dif[expr{$exp-$a}]
设置前端[expr{$front/(10.0**$dif)}]
设置exp$a
}否则{
#如果是第一个,获取差异并调整“前”
set dif[expr{$exp-$b}]
设置前端[expr{$front/(10.0**$dif)}]
设置exp$b
}
#返回格式化的数字,前面最多3位,指数最多2位
返回[格式%3ge-%.2d$front$exp]
}
请注意,原始代码返回
6.25e-007
(指数中有3位数字)

如果需要更改规则或四舍五入指数,则必须更改
If
部分(即
[expr{abs($exp-$a)}]<[expr{abs($exp-$b)}]
)。例如,如果指数为9或更低,则可以使用
$exp>=$a
进行格式化

以上代码的“最近”指数



对于8.5之前的Tcl版本,使用
pow(10.0,$dif)
而不是
10.0**$dif

我想在e-09或e-12A中产生某种工程符号?好问题;我想不出任何简单的事情(今天剩下的时间我就要失去互联网了,所以我想不出更复杂的事情了……)如果你得到结果会发生什么?它应该成为
e-09
还是
e-12
?(基本上,总是向上或向下取整指数,或者最接近的指数?实际上这两者对我来说都是可以接受的,没有区别,我想在e-09或e-12中得到结果。(假设总是得到e-09)@TigranKhachikyan真棒!同时,也看到了你的其他评论。你可以简化它,只使用
if
的一部分,并选择你需要的一部分(如果你需要这两个部分中的任何一个,可以选择
a
b
)。
format %#3.6g $number
proc fix_sci {n} {

  # Not a sci-fmt number with negative exponent
  if {![string match "*e-*" $n]} {return $n}

  # The set of exponents
  set a 9
  set b 12

  # Grab the number (I called it 'front') and the exponent (called 'exp')
  regexp -- {(-?[0-9.]+)e-0*([0-9]+)} $n - front exp

  # Check which set of exponent is closer to the exponent of the number
  if {[expr {abs($exp-$a)}] < [expr {abs($exp-$b)}]} {

    # If it's the first, get the difference and adjust 'front'
    set dif [expr {$exp-$a}]
    set front [expr {$front/(10.0**$dif)}]
    set exp $a
  } else {

    # If it's the first, get the difference and adjust 'front'
    set dif [expr {$exp-$b}]
    set front [expr {$front/(10.0**$dif)}]
    set exp $b
  }

  # Return the formatted numbers, front in max 3 digits and exponent in 2 digits
  return [format %3ge-%.2d $front $exp]  
}