-
Notifications
You must be signed in to change notification settings - Fork 112
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix #181: float32 accuracy issue #196
Conversation
a unit test is required for it |
Codecov Report
@@ Coverage Diff @@
## master #196 +/- ##
==========================================
+ Coverage 66.01% 66.42% +0.41%
==========================================
Files 22 22
Lines 2845 2850 +5
==========================================
+ Hits 1878 1893 +15
+ Misses 749 742 -7
+ Partials 218 215 -3
Continue to review full report at Codecov.
|
suggest to add a new func encFloat32 to receive a float32 and encode it, the string converting would degrade performance |
I referenced dubbo-hessian-lite/PR#12 to create this patch. Adding
|
currently hessian2 encoding all float as 64-bit float, while decoding support multiple cases. |
we can add comment here. In my opinion, we should keep pace with dubbo-hessian-lite. |
pls check whether dubbo-hessian-lite support 32-bit format |
Hi, here is the implement of float32 encode in dubbo-hessian-lite. As we can see, dubbo-hessian-lite cast float to double. So I don't think it supports the 32-bit format. |
it support exactly, and fully adapt the hessian protocol, see: https://github.com/apache/dubbo-hessian-lite/blob/aea62f0a8e82cad885cc0f7f568e9c27ef6ea70c/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Output.java#L733 |
@wongoo yeah, you are right. I had a careful check the code block, and foud dubbo-hessian-lite both support In fact, dubbo-hessian-lite encode the number depending the value, but not the type, So what should we do?
|
my opinion is adding a new func for float32. |
- Call encFloat32 to encode float32 while encoding - Add unit test case to test float32 encoding
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pls add unit test for math.MaxFloat32、math.MaxFloat32-1、math.MaxFloat32+1、math.MaxFloat64、math.MaxFloat64-1
pls format the code |
Fair enough. But I need some time to adjust the test case.
done |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hessian2规范 float就是64位的,hessian go不应该用float32去表示它,因为可能溢出不能完全解决问题。
我的建议:
- 针对hessian库支持,应该用float64去处理,不应该用float32,并且不应先转string,因为float是基础类型
- 应该在readme告知开发者应该使用float64
Hessian2 float is 64-bit, and Hessian Go should not be represented by float32 because overflow may not solve the problem completely.
my advice:
- Hessian Go USES Float64 encoding and decoding instead of converting a String first
- The user should be explicitly informed in the ReadME of Hessian Go that instead of using Float32, it should be treated with Float64.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
* add license checker (#175) * add release note for v1.5.0 (#178) Co-authored-by: Xin.Zh <dragoncharlie@foxmail.com> * Imp: cache in reflection (#179) * benchmark result * use cache in findField * encode benchmark * call field() once * remove version * fix import sync * cache in registerPOJO * add json bench result * prune unneccessary rtype.Field(index) * cache comment * rename cache * switch to if * remove return value name * findFieldWithCache * remove if check when fieldStruct is nil Co-authored-by: 望哥 <gelnyang@163.com> * update dependency * rename serialize arg name * Create .asf.yaml * 优化hessian解码string性能,提升54% * optimize code. * optimize code. * fix code review. * optimize codes. * optimize cods. * optimize code. * update license * go.sum * ci go version * testify -> 1.4.0 * testcase * travis.yml * decode value before reflect find * setvalue * decode nilPtr to nilPtr * fix get attachment lost nil key * manually import package * add ToMapStringString unit test * rename test function name with issue * setmap * support for decode emoji. * refactor code * add unit test. * add unit tests. * refactor tests. * Update travis/main.sh (#200) - Remove duplicate key 'webhooks' - Key 'matrix' is an alias for `jobs`, using `jobs` - Specify the os and dist explicitly * Mod: modify * Code format (#199) * .gitignore * code clean * code clean * remove length check * Fix: comments * Fix: format package * Fix #181: float32 accuracy issue (#196) * Fix #181: float32 accuracy issue * Fix go fmt failure * Add the unit test case for Issue181 * Add encFloat32 in double.go to encode float32 type - Call encFloat32 to encode float32 while encoding - Add unit test case to test float32 encoding * Improve encFloat32 of double.go * Fix git fmt failure * add release note for v1.6.0 (#202) * add release note for v1.5.1 * add release note for v1.5.1 * add notice * update notice * =fix release note for v1.6.0 Co-authored-by: Joe Zou <joezou@apache.org> Co-authored-by: Xin.Zh <dragoncharlie@foxmail.com> Co-authored-by: huiren <zhrlnt@gmail.com> Co-authored-by: Huang YunKun <htynkn@gmail.com> Co-authored-by: zonghaishang <yiji@apache.org> Co-authored-by: fangyincheng <fangyc666@gmail.com> Co-authored-by: champly <champly@outlook.com> Co-authored-by: wilson chen <willson.chenwx@gmail.com> Co-authored-by: fangyincheng <fangyincheng@sina.com> Co-authored-by: gaoxinge <gaoxx5@gmail.com>
* add license checker (#175) * add release note for v1.5.0 (#178) Co-authored-by: Xin.Zh <dragoncharlie@foxmail.com> * Imp: cache in reflection (#179) * benchmark result * use cache in findField * encode benchmark * call field() once * remove version * fix import sync * cache in registerPOJO * add json bench result * prune unneccessary rtype.Field(index) * cache comment * rename cache * switch to if * remove return value name * findFieldWithCache * remove if check when fieldStruct is nil Co-authored-by: 望哥 <gelnyang@163.com> * update dependency * rename serialize arg name * Create .asf.yaml * 优化hessian解码string性能,提升54% * optimize code. * optimize code. * fix code review. * optimize codes. * optimize cods. * optimize code. * update license * go.sum * ci go version * testify -> 1.4.0 * testcase * travis.yml * decode value before reflect find * setvalue * decode nilPtr to nilPtr * fix get attachment lost nil key * manually import package * add ToMapStringString unit test * rename test function name with issue * setmap * support for decode emoji. * refactor code * add unit test. * add unit tests. * refactor tests. * Update travis/main.sh (#200) - Remove duplicate key 'webhooks' - Key 'matrix' is an alias for `jobs`, using `jobs` - Specify the os and dist explicitly * Mod: modify * Code format (#199) * .gitignore * code clean * code clean * remove length check * Fix: comments * Fix: format package * Fix #181: float32 accuracy issue (#196) * Fix #181: float32 accuracy issue * Fix go fmt failure * Add the unit test case for Issue181 * Add encFloat32 in double.go to encode float32 type - Call encFloat32 to encode float32 while encoding - Add unit test case to test float32 encoding * Improve encFloat32 of double.go * Fix git fmt failure * add release note for v1.6.0 (#202) * add release note for v1.5.1 * add release note for v1.5.1 * add notice * update notice * =fix release note for v1.6.0 * Fix: eunm encode in request get error (#203) * fix bug: eunm encode in request get error * fix mod * add ut * remove go.mod 1.13 to fix the ci Co-authored-by: Joe Zou <joezou@apache.org> Co-authored-by: Xin.Zh <dragoncharlie@foxmail.com> Co-authored-by: huiren <zhrlnt@gmail.com> Co-authored-by: Huang YunKun <htynkn@gmail.com> Co-authored-by: zonghaishang <yiji@apache.org> Co-authored-by: fangyincheng <fangyc666@gmail.com> Co-authored-by: champly <champly@outlook.com> Co-authored-by: wilson chen <willson.chenwx@gmail.com> Co-authored-by: fangyincheng <fangyincheng@sina.com> Co-authored-by: gaoxinge <gaoxx5@gmail.com> Co-authored-by: panty <pantianying@gmail.com>
* Fix #181: float32 accuracy issue * Fix go fmt failure * Add the unit test case for Issue181 * Add encFloat32 in double.go to encode float32 type - Call encFloat32 to encode float32 while encoding - Add unit test case to test float32 encoding * Improve encFloat32 of double.go * Fix git fmt failure
* add license checker (#175) * add release note for v1.5.0 (#178) Co-authored-by: Xin.Zh <dragoncharlie@foxmail.com> * Imp: cache in reflection (#179) * benchmark result * use cache in findField * encode benchmark * call field() once * remove version * fix import sync * cache in registerPOJO * add json bench result * prune unneccessary rtype.Field(index) * cache comment * rename cache * switch to if * remove return value name * findFieldWithCache * remove if check when fieldStruct is nil Co-authored-by: 望哥 <gelnyang@163.com> * update dependency * rename serialize arg name * Create .asf.yaml * 优化hessian解码string性能,提升54% * optimize code. * optimize code. * fix code review. * optimize codes. * optimize cods. * optimize code. * update license * go.sum * ci go version * testify -> 1.4.0 * testcase * travis.yml * decode value before reflect find * setvalue * decode nilPtr to nilPtr * fix get attachment lost nil key * manually import package * add ToMapStringString unit test * rename test function name with issue * setmap * support for decode emoji. * refactor code * add unit test. * add unit tests. * refactor tests. * Update travis/main.sh (#200) - Remove duplicate key 'webhooks' - Key 'matrix' is an alias for `jobs`, using `jobs` - Specify the os and dist explicitly * Mod: modify * Code format (#199) * .gitignore * code clean * code clean * remove length check * Fix: comments * Fix: format package * Fix #181: float32 accuracy issue (#196) * Fix #181: float32 accuracy issue * Fix go fmt failure * Add the unit test case for Issue181 * Add encFloat32 in double.go to encode float32 type - Call encFloat32 to encode float32 while encoding - Add unit test case to test float32 encoding * Improve encFloat32 of double.go * Fix git fmt failure * add release note for v1.6.0 (#202) * add release note for v1.5.1 * add release note for v1.5.1 * add notice * update notice * =fix release note for v1.6.0 Co-authored-by: Joe Zou <joezou@apache.org> Co-authored-by: Xin.Zh <dragoncharlie@foxmail.com> Co-authored-by: huiren <zhrlnt@gmail.com> Co-authored-by: Huang YunKun <htynkn@gmail.com> Co-authored-by: zonghaishang <yiji@apache.org> Co-authored-by: fangyincheng <fangyc666@gmail.com> Co-authored-by: champly <champly@outlook.com> Co-authored-by: wilson chen <willson.chenwx@gmail.com> Co-authored-by: fangyincheng <fangyincheng@sina.com> Co-authored-by: gaoxinge <gaoxx5@gmail.com>
The issue accuracy is caused by casting from float32 to float64 when encoding, which leads to extra decimal appended to the original float. Transformation from float32 to string, and then float64 could avoid this issue.