結果が異なる点について
C言語ではintとfloatの乗算では両方の値がfloatへ変換された上で演算されますが、numpy.float32はintと乗算すると結果がfloat64(多くのCの実装におけるdouble型)になるようです。(Pythonの整数型(int)が多倍長精度であることに関係するのかも知れません。)
まず計算結果そのものを合わせるにはCと同じ規則で(floatの精度で)演算結果が求まるように注意深く式を記述しなければならないと思います。
Python
1from numpy import float32
2
3A = 839.896912
4B = 0.25
5E = 1.0
6c = 2480
7d = 2474
8
9## NG
10
11g = (float32(A) + c * float32(B)) / float32(E)
12print(type(g), g) # ==> <class 'numpy.float64'> 1459.8969116210938
13
14## OK
15
16g = (float32(A) + float32(c) * float32(B)) / float32(E)
17print(type(g), g) # ==> <class 'numpy.float32'> 1459.897
余談?: 値が同じでも文字列化(フォーマット)の仕様により違う値に見える
例え同一の値が得られたとしても、C言語でのprintfの結果に一致させるのはPythonでは容易ではないと思います。浮動小数点数を印字する際の文字列への変換仕様が異なるからです。printfの仕様(%fとすると小数点以下6位まで印字されるとか)を前提としてcan110さん回答のように小数点以下の桁数をformatに指定するのが簡単な方法だと思います。しかし%gや%eなど任意の数値・フォーマットについてCのprintfと同じ結果を表示するのはなかなか難しいのではないでしょうか?
ということで、かなりヘンテコな方法かも知れませんが「Cのsprintfをpythonから呼び出してしまうのはどうだろう」と思いやってみました。ctypesモジュールは使ったことないのでおかしな実装をしているかも知れません。なおスミマセンガ下記はWindows限定のコードです。Cのランタイムmsvcrtを使うコードを明示的に書いてしまってます。
Python
1from ctypes import *
2libc = cdll.msvcrt
3
4def format_double(fmt, f):
5 charset = 'latin1'
6 _buffer = create_string_buffer(100)
7 _fmt = bytes(fmt, encoding=charset)
8 libc.sprintf(_buffer, _fmt, c_double(f))
9 return str(_buffer.value, encoding=charset)
10
11
12A = float32(839.896912)
13B = float32(0.25)
14E = float32(1.0)
15c = 2480
16d = 2474
17
18g = float32((A + float32(c) * B) / E)
19f = float32((A + float32(d) * B) / E)
20print('--python--')
21print('g is', g)
22print('f is', f)
23print('--sprintf--')
24print(format_double("g is %f", g))
25print(format_double("f is %f", f))
cmd
1> python test.py
2--python--
3g is 1459.897
4f is 1458.397
5--sprintf--
6g is 1459.896973
7f is 1458.396973
(Windows10 64bit, CPython 3.7)
sprintfにdoubleへ変換したものを渡してますがprintfなどにfloatを渡しても実際にはdoubleへ変換されたものが引数となるためこうしています。(自分の知識はCの規格書を正確に把握しているレベルではありません。msvcrtでは%fでfloatもdoubleも印字できることから前述のようになっているはずと判断しているにすぎません。)